大家好,又见面了,我是你们的朋友全栈君。
每日一题
- 第一周
- 1、添加路由
- 2、如何防止Linux命令行或脚本里MySQL登录密码泄露?
- 3、将前端运行的服务或脚本,如何可以放置到后端进行执行
- 4、linux网络配置中如何给一块网卡添加多个IP地址
- 5、查找占用内存的前3名进程
- 6、如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.133.126
- 7、简述DNS进行域名解析的过程?
- 第二周
- 1、进程与线程
- 2、将一个文本的奇数行和偶数行合并
- 3、光标
- 4、累计相加
- 5、软硬链接
- 6、数组统计
- 7、Linux启动流程
- 第三周
- 1、创建一个dir_xyz目录,让该组成员都能在该目录下创建或访问文件,但是除了文件创建者之外的其他人不能删除文件,你会怎么做?
- 2、cut命令
- 3、多种查看eth0地址信息
- 4、统计linux系统的history历史记录,得出前10最喜欢的
- 5、Linux中查看系统已经登录用户的命令
- 6、查找出/tmp目录下面修改时间是7天以前,大小在50k到2M之间,并以.log结尾的文件
- 7、查找出/tmp目录下面修改时间是7天以前,大小在50k到2M之间,并以.log结尾的文件,把这些文件复制到/data目录中
- 第四周
- 1、登录环境故障-bash-4.1的原因及解决办法
- 2、如何删除多个文件中包含的空格或其他特殊字符,怎么做
- 3、CPU使用率超过80%或硬盘超过85%邮件报警
- 4、监控学校的网络出口正常性,需要写一个脚本,操作系统每30秒钟访问百度首页,如果能够正常打开则记录正常日志,如果出现异常则发邮件报警。
- 5、如何快速删除Linux中海量小文件
- 6、如何统计脚本执行的时间?
- 7、通过访问日志access.log统计的IP和每个地址访问的次数
- 第五周
- 1、如何正确清理MySQL binlog
- 2、开机自启
- 3、使用文件的访问控制列表功能来授权root用户有x权限
- 4、把test.txt文件里面所有字母都转换成大写
- 5、设置一条Iptables规则,允许192.168.10.0段访问873端口
- 6、vim命令粘贴带#号或注释信息格式会出现混乱情况,有什么方法进行解决?
- 7、使用find命令的时候 |xargs(管道xargs)与-exec有什么区别?
- 第六周
- 1、变量a=’a/b/c’如何截取得到c
- 2、一个100M的磁盘分区,写入0.5K的文件,或写入1M的文件,分别可以写多少个?为什么?
- 3、请描述下面列出的 http 状态码的含义
- 4、Linux root 密码忘了,如何找回来?
- 5、怎么才能在输入IP后找到/etc/hosts里对应的唯一的hostname?
- 6、使用命令调换 /etc/passwd 文件里所有的第一列和最后一列位置
- 7、统计/var/log/下所有文件个数
- 第七周
- 1、题目:批量添加20个用户,用户名为user1~20,密码为5个随机字符(要求不能使用shell循环语句)
- 2、如何过滤出已知当前目录下home中的所有一级目录(提示:不包含home目录下面目录的子目录及隐藏目录,即只能是一级目录)?
- 3、只能保留最近 7 天的访问日志
- 4、打印行号及内容
- 5、系统运行级别
- 6、如何优化Linux系统
- 7、解压压缩
- 第八周
- 1、过滤字符串 I am kolor, myqq is 3302 ,过滤出kolor和3302
- 2、查看/etc/services 文件内容有多少行?
- 3、过滤出/etc/services 文件包含 3306 或 1521 两数据库端口的行的内容。
- 4、描述 linux 系统从开机到登陆界面的启动过程
- 5、如何取得/kolor 文件的权限对应的数字内容,如-rw-r–r– 为 644, 要求使用命令取得644 这样的数字。
- 6、显示指定行内容
- 7、查找当前目录下所有文件,并把文件中的 www.baidu.com 字符串替换成 www.abc.cc
- 第九周
- 1、sudo su 和 su
- 2、如何把文件中的空行过滤掉
- 3、查看命令路径
- 4、查看哪些用户在线的linux命令
- 5、关机重启注销
- 6、分时日月周crontab
- 7、下列路径的内容
- 第十周
- 1、如何查看用户的 uid 及属于的组信息。
- 2、添加一个用户kolor,并指定属于 sa 组,要求组 ID 为 801, uid 为 808,并且不建立家目录及禁止其登陆。
- 3、mysql主从原理?主从不同步怎么办?主从慢,差的多咋办?
- 4、mount永久挂载
- 5、打印一个目录下所有包含字符串A的行
- 6、iptables
- ★7、页面无法访问排查思路
- 第十一周
- 2.取出/tmp目录下面的10个文件的第一行
- 3.通过Iptables来限定apache每秒钟连接数为1,峰值为3
- 4.假设Apache 产生的日志文件名为access_log,在apache 正在运行时,执行命令mv access_log access_log.bak,执行完后,请问新的apache 的日志会打印到哪里,为什么?
- 5.实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网
- 第十二周
- 1.优化shell脚本
- 2.如何让linux也像windows那样有一个回收站,避免数据的误删除,进而恢复误删数据?
- 3.基础娱乐命令:像幻灯片一样播放每个字符
- 4.批量重命名,文件批量重命名为 00.jpg …..10.jpg
- 5./etc/profile /etc/bashrc .bashrc .bash_profile的区别
- 6.如何修改主机名
- 第十三周
- 1.命令风暴:打印出001 002 003 这样的格式的数字
- 2.如何实现 Nginx 代理的节点访问日志记录客户的 IP 而不是代理的 IP?
- 3.❤IDC 机房带宽突然从平时 100M 增加到 400M,请你分析问题所在并解决
- 4.发现文件系统只读了,是什么原因?如何解决?
- 5.binlog是什么?记录的什么?有几种工作模式及企业应用场景
- 第十四周
- 1.两个文件,把第一个文件中的第2、3行内容添加到第二个文件的第3行后面
- 2.脚本直接执行没有问题,在定时任务中有问题,什么原因?
- 3.nfs客户端挂载信息写入/etc/fstab中,系统重启,没有自动挂载是什么原因?
- 4.Nginx需要优化哪些内容?
- 5.企业生产MySQL如何优化?
- 第十五周
- 2.对输入的脚本文件进行语法检查;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本;
- 3.根据要求写出itpables防火墙规则
- 4.显示出打印第二列为kolor行的第一列内内容
- 5.权限拒绝 常见的permission denied 原因
- 第十六周
- 3.网络并发,并发与架构设计基础知识
- 4.虚拟机使用知识点: vmware centos7虚拟机克隆系统如何修改网卡设置?
- 5.❤shell知识点:shell脚本中字符串截取
- 第十七周
- 第十八周
- 第十九周
第一周
1、添加路由
默认生产环境中,三台服务器均可满足访问外网需求;但最终目标是完成服务器01与服务器03之间的不同网段间通讯,即服务器01的10.0.0.10主机IP地址可以正常访问服务器03的10.0.1.10主机IP地址
vmnet8虚拟网配置项:
- 选中【NAT模式与虚拟机共享主机的IP地址】
- 选中【将主机虚拟适配器连接到此网络】
- 子网IP【10.0.0.0】;子网掩码【255.255.255.0】
vmnet1虚拟网配置项:
- 选中【仅主机模式在专用网络内连接虚拟主机】
- 选中【将主机虚拟适配器连接到此网络】
- 子网IP【10.0.1.0】;子网掩码【255.255.255.0】
route -n 打印主机路由表条目信息
服务器01上配置网络路由条目
route add -net 10.0.1.0 netmask 255.255.255.0 gw 10.0.0.11
服务器03上配置网络路由条目
route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.1.11
配置开启主机路由转发功能
服务器02主机在拓扑中负责进行路由转发,需要开启相应配置参数
# vim /etc/sysctl.conf
net.ipv4.ip_forward= 1
# sysctl -p
服务器主机02起到路由转发功能,类似于路由器的角色,因此服务器上防火墙功能需要关闭,否则防火墙相应条目会阻止掉路由转发流量
补充:
添加到某主机的路由
route add -host 10.0.1.10 gw 10.0.1.11
添加默认路由
route add default gw 10.0.0.11
添加永久路由
方法1:在/etc/rc.local里添加执行命令文本内容
route add -host 10.0.1.10 gw 10.0.1.11
该方法注意点:需要/etc/rc.local具有开机执行权限,该方法的缺陷是在/etc/init.d/network服务重启后添加的路由会消失
方法2:增加文件,并写入如下需要添加的路由信息:vim /etc/sysconfig/static-routes
代码语言:javascript复制any net 220.181.9.0/24 gw 192.168.72.2
any host 220.181.9.2 gw 192.168.72.2
该方法的原理为:/etc/init.d/network在启动时,会调用执行/etc/sysconfig/static-routes文件内容 此方法的优点是:即使/etc/init.d/network服务重启,路由表信息也不会丢失。
2、如何防止Linux命令行或脚本里MySQL登录密码泄露?
①可以通过如下环境变量强制Linux不记录敏感历史命令 在命令行执行HISTCONTROL=ignorespace后,再输入带密码的命令的前面加一个空格登录,登录命令不会被记录到历史记录里。
代码语言:javascript复制[root@kolor ~]# HISTCONTROL=ignorespace
表示忽略以空白字符开头的命令。
这里是临时生效,要想永久生效,请放入/etc/bashrc。
[root@kolor ~]# mysql -uroot -p'123'
②操作完敏感的命令后可以及时删除命令行记录 执行“history -d 历史命令序号” 清除指定历史记录命令 [root@kolor~]# history -d 252
执行“history -c”清除所有所有记录 [root@kolor~]# history -c
③给带密码的启动脚本以及备份脚本等加700权限,用户和组改为root。
④把密码写入my.cnf配置文件并加700权限,用户和组改为mysql。
代码语言:javascript复制<==配置文件开头添加如下三行,无需重启系统。
[client] #<==客户端模块标签。
user=root #<==用户参数及密码。
password=123 #<==密码参数及密码。
[root@kolor ~]# mysql
#<==此时登录数据库就不用输入密码了。
3、将前端运行的服务或脚本,如何可以放置到后端进行执行
方法一:可以利用screen命令进行后台运行(yum -y install screen) 在命令行执行screen 回车,进入一个随机的screen后台,可以输入命令,然后按ctrl a d保存退出即可,这时程序已经在后台运行。 screen ls可以查看当前运行screen后台列表,执行screen r 加PID可以进入相应的后台,再次退出还需要按ctrl a d 如何想要删除screen,需要执行kill -9 3215(screen ls查看到的脚本后台进程号),然后执行screen -wipe 即可删除。
方法二:可以利用nohup命令进行后台运行: 即程序已经在后台运行,可以在当前目录查看tail -fn 10 nohup.out可以看到程序执行的相关信息,如果需要结束就直接kill 进程就OK。 -f 持续读取 -n<行数> 显示文件的尾部 n 行内容 nohup command &
方法三:ctrl z 注意这是让当前运行的脚本到后台,然后”暂停”.运行。
- 通过jobs管理后台程序
- 让暂停的程序继续在后台运行,使用bg命令(background).
- 让后台程序恢复前台运行,使用fg命令。
4、linux网络配置中如何给一块网卡添加多个IP地址
子网卡(别名) ①手工配置别名的VIP的方法
代码语言:javascript复制ifconfig eth0:1 10.0.0.100 netmask 255.255.255.224 up
route add -host 10.0.0.100 dev eth0
###---增加一条主机路由,可选配置
②手工查看 ifconfig ③手工删除别名VIP的方法
代码语言:javascript复制ifconfig eth0:1 10.0.0.100 netmask 255.255.255.224 down
ifconfig eth0:1 down
④别名IP永久生效的方法 写入到网卡配置文件可让别名IP永久生效,名字可以为ifcfg-eth0:x,x为0-255的任意数字,IP等内容格式和ifcfg-eth0一致
代码语言:javascript复制vim /etc/sysconfig/network-scripts/ifcfg-eth0:1
DEVICE=eth0:1
IPADDR=10.0.0.100
❤辅助IP IP alias 是由 ifconfig 程序来创建和维护的,而 secondary IP address 则是由 ip 程序来创建和维护的。ip addr add 创建的 secondary IP address 不能在 ifconfig -a 中看到,反过来,ifconfig 创建的 ethX:Y 却能在 ip addr show 中看到
①手工配置别名的VIP的方法
代码语言:javascript复制ip addr add 10.0.0.100/24 dev eth0
ip addr add 10.0.0.101/24 broadcast 10.0.0.255 dev eth0
ip addr add 10.0.0.101/24 broadcast 10.0.0.255 dev eth0 label eth0:0
②手工查看VIP别名的方法 ip addr ③手工删除别名VIP的方法
代码语言:javascript复制ip addr del 10.0.0.100/24 dev eth0
ip addr del 10.0.0.101/24 broadcast 10.0.0.255 dev eth0
5、查找占用内存的前3名进程
方法一:top 按内存列排序,x高亮,z加颜色,使用>可以移动到以内存排序
方法二:ps -aux | sort -k4nr | head -3
6、如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.133.126
代码语言:javascript复制iptables -t nat -A PREROUTING -d 192.168.133.126 -p tcp --dport 80 -j DNAT --to-des 192.168.133.126:8080
7、简述DNS进行域名解析的过程?
用户要访问www.baidu.com,会先找本机的host文件,再找本地设置的DNS服务器,如果也没有的话,就去网络中找根服务器,根服务器反馈结果,说只能提供一级域名服务器.cn,就去找一级域名服务器,一级域名服务器说只能提供二级域名服务器.com.cn,就去找二级域名服务器,二级域服务器只能提供三级域名服务器.baidu.com.cn,就去找三级域名服务器,三级域名服务器正好有这个网站www.baidu.com,然后发给请求的服务器,保存一份之后,再发给客户端
第二周
1、进程与线程
①进程是资源分配的最小单位,线程是CPU调度的最小单位 ②进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。 而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。 ③多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另一个进程造成影响,因为进程有自己独立的地址空间
进程
- 优点:多进程可以同时利用多个CPU,能够同时进行多个操作。
- 缺点:耗费资源(创建一个进程重新开辟内存空间),进程不是越多越好
线程:
- 优点:共享内存,尤其是进行IO操作(网络、磁盘)的时候(IO操作较少用CPU),可以用多线程执行并发操作。
- 缺点:抢占资源
IO密集型(不用CPU):多线程 计算密集型(用CPU):多进程
2、将一个文本的奇数行和偶数行合并
代码语言:javascript复制1、sed 'N;s#n# #g' test.txt
N表示读取下一行,给sed处理,也就是sed同时处理2行。
2、xargs -d "n" -n2 < test.txt
xargs默认使用的是空格为分隔符,通过-d指定新的分隔符,这里修改为n回车换行 为分隔符。
-n2表示以回车为换行符后,我要每行显示两列,也就是两行。
3、awk判断
awk 'NR%2==1{line=$0;next}{print line,$0}' test.txt
当前行是奇数行时执行line=$0,将整行赋值给line,next跳过其余的命令
4、awk判断奇偶行并显示
awk '{if(NR%2==0) print $0;else printf $0 " "}' test.txt
3、光标
代码语言:javascript复制光标移动
ctrl a 切换到命令行开始
ctrl e 切换到命令行末尾
剪切粘贴
ctrl u 清除(剪切)光标之前的内容
ctrl k 清除(剪切)光标之后的内容
ctrl y 粘贴
esc f 把光标移动到单词的结尾
esc f 把光标移动到单词的开头
ctrl b 光标向左移动一个符号的位置
ctrl f 光标向右移动一个符号的位置
4、累计相加
代码语言:javascript复制假如现在有个文本,格式如下:
a 1
b 3
c 2
d 7
b 5
a 3
g 2
f 6
d 9
即左边是随机字母,右边是随机数字,要求写个脚本使其输出格式为:
a 4
b 8
c 2
d 16
f 6
g 2
代码语言:javascript复制awk '{h[$1]=h[$1] $2} END {for(pol in h) print pol,h[pol]}' array_add.txt
这里只有两列,第一列是字母,第二列是数字是我们要相加的东西。
这里我们选择第一列作为房间号码即元素名称。
END关键字,会在读完数据后执行 BEGIN关键字,需要在处理数据前运行脚本,比如为报告创建开头部分
RS,输入文件的行分隔符,缺省是换行符 FS,输入文件的列分隔符,缺省是连续的空格和Tab NF,当前行所拥有的列数 NR,表示awk开始执行程序后读取的数据行数 FNR,awk当前读取的记录数,其变量值小于等于NR(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。 NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件。
awk处理多个文件的基本语法是: awk -F分隔符 ‘BEGIN { 初始化 } { 循环执行部分 } END { 结束处理 }’ file_list1 file_list2
5、软硬链接
- 不能对目录创建硬链接,但可以创建软链接,对目录的软链接会经常被用到
- 软链接可以跨文件系统,硬链接不可以跨文件系统。
- 删除软和硬链接文件,对源文件及软和硬链接文件无任何影响;
- 删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效(红底白字闪烁状);
- 同时删除源文件及其硬链接文件,整个文件才会被”真正”的删除。
在linux系统中,链接分两种 :一种是硬链接(Hard Link),另一种被称为符号链接或软链接(Symbolic Link)。 默认不带参数情况下,ln命令创建的是硬链接。
- 硬链接文件与源文件的inode节点号相同,而软链接文件的inode节点号与源文件不同。
- ln命令不能对目录创建硬链接,但可以创建软链接,对目录的软链接会经常被用到。
- 删除软链接文件,对源文件及硬链接文件无任何影响;
- 删除文件的硬链接文件,对源文件及软链接文件无任何影响;
- 删除链接文件的原文件,对硬链接文件无影响,会导致其软链接失效(红底白字闪烁状);
- 同时删除原文件及其硬链接文件,整个文件才会被真正的删除。
- 很多硬件设备中的快照功能,使用的就类似硬链接的原理。
- 软连接可以跨文件系统,硬链接不可以跨文件系统。
6、数组统计
代码语言:javascript复制处理以下文件内容,将域名取出并根据域名进行计数排序处理:
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
要求结果:
mp3.etiantian.org 1
post.etiantian.org 2
www.etiantian.org 3
代码语言:javascript复制思路:
1.以斜线为菜刀取出第二列(域名)
2.创建一个数组,把第二列(域名)作为数组的下标,通过类似于i 的形式进行计算数量
3.统计后把结果输出
awk -F "/ " '{hotel[$2] }END{for(pol in hotel) print pol,hotel[pol]}' url.txt|sort -rnk2
7、Linux启动流程
1、主机加电自检,加载BIOS硬件信息 2、读取MBR的引导文件(GRUB、LILO) 3、引导Linux内核 4、运行第一个进程init(进程号永远为1), 5、进入相应的运行级别 6、运行终端,输入用户名和密码
第三周
1、创建一个dir_xyz目录,让该组成员都能在该目录下创建或访问文件,但是除了文件创建者之外的其他人不能删除文件,你会怎么做?
#mkdir dir_xyz #chmod g wx dir_xyz #chmod t dir_xyz 最后一行命令——权限位最后的 ‘ t’ 是粘滞位,它用来替换x,表明在这个目录中,文件只能被它们的拥有者、目录的拥有者或者是超级用户root删除。
2、cut命令
cut命令主要是接受三个定位方法: 第一,字节(bytes),用选项-b 第二,字符(characters),用选项-c 第三,域(fields),用选项-f
①截取test.txt的前10列 cut -c 1-10 test.txt
②截取该文件中的第二,第五和第七列 cut -d: -f 2,5,7 /etc/passwd
③截取前三个字节
[root@aliyun ~]# date
Sun Sep 13 04:50:10 CST 2020
[root@aliyun ~]# date | cut -b 1-3
Sun
3、多种查看eth0地址信息
代码语言:javascript复制sed: ifconfig eth0 | sed -n '2p' | sed 's#^.*inet ##g' | sed 's#n.*$##g'
grep awk: ifconfig eth0 | grep inet | awk '{print $2}'
sed awk: ifconfig eth0 | sed -n '2p' | awk '{print $2}'
4、统计linux系统的history历史记录,得出前10最喜欢的
代码语言:javascript复制history | awk '{h[$2] } END {for(key in h) print key,h[key]}' | sort -rnk2 | head
优雅的显示可以加上 column -t
history | awk '{h[$2] } END {for(key in h) print key,h[key]}' | sort -rnk2 | head | column -t
简单处理法:history | awk ‘{print $2}’ | sort |uniq -c | sort -nr | head
5、Linux中查看系统已经登录用户的命令
①w,显示谁远程登录了系统并且在干什么 ②who,显示谁远程登录了 ③last,显示最近远程登录的用户,也可以查看已经登录的用户
6、查找出/tmp目录下面修改时间是7天以前,大小在50k到2M之间,并以.log结尾的文件
代码语言:javascript复制find /tmp/ -type f -mtime 7 -size 50k -a -size -2M -regex '.*.log$'
50k 表示大于50k的文件
-2M 表示小于2M的文件
7、查找出/tmp目录下面修改时间是7天以前,大小在50k到2M之间,并以.log结尾的文件,把这些文件复制到/data目录中
代码语言:javascript复制find /tmp/ -type f -mtime 7 -size 50k -a -size -2M -name "*.log" | xargs -i cp {
} /data
find /tmp/ -type f -mtime 7 -size 50k -a -size -2M -name "*.log" -exec cp {
} /tmp ;
cp $(find /tmp/ -type f -mtime 7 -size 50k -a -size -2M -name "*.log") /data
第四周
1、登录环境故障-bash-4.1的原因及解决办法
-bash-4.1$ 这种一般是因为用户删除文件的时候,把当前用户的家目录的一些隐藏文件删除所导致的。导致.bashrc .bash_profile没了,与用户有关的环境变量也没了。
解决办法:把用户老家root的模板/etc/skel下面的.bash_profile和.bashrc复制到出问题的用户
代码语言:javascript复制-bash-4.1$whoami
kolor
-bash-4.1$cp /etc/skel/.bash* ~
重新登录测试
-bash-4.1$logout
su - kolor
2、如何删除多个文件中包含的空格或其他特殊字符,怎么做
代码语言:javascript复制find /tmp/ -type f -name "*.log" -print0 | xargs -0 ls -l
find命令的参数 -print0(注意这是数字0),表示find在找到文件后在文件的结尾加上一个标记,不用默认的空格分隔文件。 加上参数后,find命令找到的每个文件会在文件结尾加上一个标记(空符号)
正巧了,xargs 也有个参数专门识别这个空标记,-0(数字0)。xargs加上–null(等同于-0)参数就可处理空字符
3、CPU使用率超过80%或硬盘超过85%邮件报警
%Cpu(s): 0.0 us, 1.6 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st 98.4是未使用的CPU,剩余的都是使用的。
获取使用率 # top -n1 | tail -n 3 | head -1 | awk -F ‘[, ] ’ ‘{print 100-$11}’ top -n1 | tail -n 3 | head -1 tail -n 3选出从第3行开始的所有行 head -1输出筛选出的内容的第1行。
硬盘:df -h | awk -F ‘[ %] ’ ‘///{print 5}’ 完整脚本:
代码语言:javascript复制#!/bin/bash
cpuUsed=`top -n1 | tail -n 3 | head -1 | awk -F '[, ] ' '{print 100-$11}'`
diskUsed=`df -h | awk -F '[ %] ' '//$/{print $5}'`
logFile=/tmp/check.log
function Sendmail(){
mail -s "监控报警" 330289344@qq.com < $logFile
}
function check(){
if [ `echo "$cpuUsed>80"|bc` -eq 1 -o $diskUsed -ge 85 ];then
echo "`date %F` CPU使用率:${cpuUsed}%,磁盘使用率:$(diskUsed)%" >> $logFile
Sendmail
fi
}
function main(){
check
}
main
加入定时任务,每5分钟执行一次
crontab -e
/5 * * * * check.sh
4、监控学校的网络出口正常性,需要写一个脚本,操作系统每30秒钟访问百度首页,如果能够正常打开则记录正常日志,如果出现异常则发邮件报警。
代码语言:javascript复制#! /bin/bash
Web="www.baidu.com"
A="Web is Good!"
while true
do
state=`curl -I -s $Web | head -1 | cut -d " " -f2`
if [[ $state -eq "200" ]]
then
echo "$A,the Web is $Web" >> /home/log/website-access.`date %F`.log
else
echo "Web failed $Web" >> /home/log/website-error.`date %F`.log
echo "Web failed $Web `date %F`" | mail -s "website-error `date %F`" 330289344@qq.com
fi
sleep 30
done
5、如何快速删除Linux中海量小文件
N个文件,rm -rf * 会提示 -bash:/bin/rm:Argument list too long 解决办法: 1)ls | xargs rm -f 2)find . -type f | xargs rm -f 3)rsync -av –delete /null /tmp/
6、如何统计脚本执行的时间?
代码语言:javascript复制[root@myblog ~]# cat 123.sh
sleep 10
echo 123
[root@myblog ~]# time sh 123.sh
123
real 0m10.003s
user 0m0.002s
sys 0m0.001s
7、通过访问日志access.log统计的IP和每个地址访问的次数
代码语言:javascript复制awk '{s[$1] } END {for (i in s) print s[i],i}' /var/log/httpd/access_log | sort -rn | head -5
awk '{print $1}' /var/log/httpd/access_log | sort | uniq -c | sort -nr | head -5
第五周
binlog
1、如何正确清理MySQL binlog
1.手动删除
代码语言:javascript复制删除mysql-bin.000004之前的而没有包含mysql-bin.000004
mysql> purge binarylogs to 'mysql-bin.000004';
按照时间,删除指定时间之前的
mysql> purge master logs before '2017-03-20 00:00:00';
清理所有bin-log
reset master
2.设置自动删除
代码语言:javascript复制set global expire_logs_days = 7;
2、开机自启
①/etc/rc.local ②chkconfig -add httpd chkconfig –list chkconfig –level 35 mysqld on 网络文件共享服务NFS,仅在3级别上开机自启动 chkconfig –level 3 nfs on
3、使用文件的访问控制列表功能来授权root用户有x权限
[root@koloredu bin]# setfacl -m u:root:rwx /bin/chmod (这种方法用的是访问控制列表的方法实现的使root用户有x的权限) [root@koloredu bin]# chmod x /bin/chmod (此时chmod就有了x的权限了)
setfacl命令可以用来细分linux下的文件权限。 chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限。 换句话说,setfacl可以更精确的控制权限的分配。 比如:让某一个用户对某一个文件具有某种权限。
4、把test.txt文件里面所有字母都转换成大写
代码语言:javascript复制sed 's#[a-z]#u&#g' test.txt
awk '{print toupper($0)}' test.txt
(toupper是awk的内置函数,功能是将小写字母转换为大写,对应的转换成小写的做法是把toupper函数替换成tolower函数)
tr 'a-z' 'A-Z ' < test.txt
5、设置一条Iptables规则,允许192.168.10.0段访问873端口
代码语言:javascript复制iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 873 -j ACCEPT
6、vim命令粘贴带#号或注释信息格式会出现混乱情况,有什么方法进行解决?
问题说明:每次复制代码时,如果代码里有 //或# 这样的注释就容易让格式乱掉,显示的内容不整齐,并不是所期望的显示格式 原因分析:是由于vim编辑命令的自动缩进功能所影响,因此粘贴带注释的代码时可以取消自动缩进
代码语言:javascript复制vim test.txt #<--编辑一个文件
:set paste #<--在vim的命令行模式输入,关闭vim缩进功能
:set nopaste #<--开启vim缩进功能
比较方便的方法就是修改用户家目录下的 .vimrc配置文件:
set pastetoggle=<F9>
以后在插入模式下,只要按F9键就可以快速切换自动缩进模式了
说起缩进,/etc/vimrc
用vim打开vimrc文件并增加下面两行代码
set tabstop=4
7、使用find命令的时候 |xargs(管道xargs)与-exec有什么区别?
代码语言:javascript复制find /kolor -type f |xargs find命令找到的文件一次性都给 |xargs 处理
find /kolor -type f -exec find命令找到一个文件 就传递给 -exec 处理一次
find /kolor -type f |xargs tar zcf /tmp/kolor-xargs.tar.gz
相当于
tar zcf /tmp/kolor-xargs.tar.gz /kolor/stu02.txt
find /kolor -type f -exec tar zcf /tmp/kolor-exec.tar.gz {
} ;
相当于
tar zcf /tmp/kolor-exec.tar.gz /kolor/stu02.txt
tar zcf /tmp/kolor-exec.tar.gz /kolor/stu10.txt
第六周
1、变量a=’a/b/c’如何截取得到c
代码语言:javascript复制[root@shell ~]# a='a/b/c'
方法1-cut
[root@shell ~]# echo $a | cut -c5c
方法2-tr替换
[root@shell ~]# echo $a | tr "a/b/" " " <==四个空格c
方法3-tr tail方法
[root@shell ~]# echo $a | tr "/" "n" | tail -1
方法4-tr删除
[root@shell ~]# echo $a | tr -d 'a/b/'
方法5-sed替换
[root@aliyun ~]# echo $a | sed 's#a/b/##'
方法6-echo
[root@aliyun ~]# echo ${a##*/}
##*/ 表示 删除最后一个/ 及其左边字符串
2、一个100M的磁盘分区,写入0.5K的文件,或写入1M的文件,分别可以写多少个?为什么?
参考答案: 1、默认分区常规情况下,对大文件来讲inode是足够的。而block数量消耗的会更快,block为4K的情况下,1M的文件不会有浪费磁盘的情况,所以文件数量大概为100/1=100个。 2、对于小文件0.1K,inode会消耗的更快。默认分区block的数量大于inode数量的。每个小文件都会占用一个inode和一个block,inode会先消耗完,文件总量是inode的数量。
a、上面的考试题考察的是文件系统inode和block知识。 b、inode是存放文件属性信息的(也包含指向文件实体的指针),默认大小为128byte(c58),256byte(c64) c、block是存放文件实际内容的。默认大小1K(boot)或4K(非系统分区默认给4K),一般企业多用4K的block。 d、一个文件至少要占用一个inode及一个block。 e、默认较大分区常规企业真实场景情况下,inode数量是足够的。而block数量消耗会更快。
3、请描述下面列出的 http 状态码的含义
200 服务器成功返回网页 301 永久跳转,请求的网页已永久跳转到新位置。 403 禁止访问,服务器拒绝请求 404 服务器找不到请求的页面 500 内部服务器错误 502 错误网关,一般是网关服务器请求后端服务时,后端服务不可用或者没有完成响应网关服务器。 503 服务当前不可用,可能因为服务器超载或停机维护导致。 或者是代理服务器后面没有可以提供服务的节点 504 网关超时,一般是服务器过载导致没有在指定时间内返回数据给代理服务器
4、Linux root 密码忘了,如何找回来?
①开机时手要快按任意键 ②grub菜单,按e键 ③选择第二项,按e键 ④在rhgb quiet最后加”空格”,然后键入”1″或”s”或”S”或”single”都可以,按回车键返回上一层 ⑤按b键启动系统,进入到单用户模式 ⑥passwd 修改root密码
5、怎么才能在输入IP后找到/etc/hosts里对应的唯一的hostname?
192.168.1.11 baidu.com
代码语言:javascript复制# cat awkhost1.sh
awk 'BEGIN {a="'$1'"} {if($1==a) print $2; }' /etc/hosts
# sh awkhost1.sh 192.168.1.21
# cat awkhost2.sh
awk '{if($1=="'$1'") print $2}' /etc/hosts
# cat awkhost9.sh
awk '$1 == "'$1'" {print $2}' /etc/hosts
————————————————————————————————
[root@old_boy scripts]# cat judgehost.sh
#!/bin/bash
echo "please input ip address:"
read ip
[ -n "`grep "$ip " /etc/hosts`" ] && #注意前面的过滤条件结尾带有空格。
echo "The hostname is: `grep "$ip " /etc/hosts |awk '{print $2}'`" ||
echo "The ip is invalid"
[root@adminset ~]# touch /tmp/luoahong.txt
[root@adminset ~]# [ -f /tmp/luoahong.txt ] && echo 1 ||echo 0
1
-n 判断变量的值,是否为空
- 变量的值,为空,返回1,为false
- 变量的值,非空,返回0,为true
两个变量判断是否相等
if [ "$var1" = "$var2" ]; then
[ STRING1 == STRING2 ] 如果两个字符串相同则返回为真
1)这是一个grep过滤加条件判断的实现语法:
2)条件判断语法为[ -n "ddd" ] && echo 1 || echo 0
3)[ -n "`grep "$ip " /etc/hosts`" ] && #注意前面的过滤条件结尾带有空格。这里啊,是为了排除下面的重复情况
—————————————————————————————————
6、使用命令调换 /etc/passwd 文件里所有的第一列和最后一列位置
代码语言:javascript复制例:默认:root:x:0:0:root:/root:/bin/bash
修改后:/bin/bash:x:0:0:root:/root:root
awk -F ":" '{a=$1;$1=$NF;$NF=a;print}' /etc/passwd | tr " " ":"
print默认是print $0 。 tr 把分隔符替换成冒号
7、统计/var/log/下所有文件个数
题目解析: 1、/var/log/下所有文件包括当前目录和子目录以及子目录的子目录下面的文件 2、linux下文件有很多类型,包括 普通文件、链接文件、字符设备文件、块设备文件、socket文件等
代码语言:javascript复制find /var/log/ ! -type d | wc -l
74
tree /var/log/ | awk 'END{print $3}'
74
第七周
1、题目:批量添加20个用户,用户名为user1~20,密码为5个随机字符(要求不能使用shell循环语句)
代码语言:javascript复制echo user{
1..20}|xargs -n1|sed -r 's#(.*)#useradd 1 && echo 1 >>/tmp/passwd.txt && echo $RANDOM |md5sum |cut -c 1-5>>/tmp/passwd.txt && echo `tail -1 /tmp/passwd.txt`|passwd --stdin 1#g'|bash
2、如何过滤出已知当前目录下home中的所有一级目录(提示:不包含home目录下面目录的子目录及隐藏目录,即只能是一级目录)?
代码语言:javascript复制方法1:通过find直接查找指定类型的文件
find ./home -type d -maxdepth 1
方法2:ls -l结果中以d开头的就是目录
ls -l ./home | grep "^d"
ls -S 以文件的大小进行排序
ls -R 将目录下所有的子目录的文件都列出来
ls -t 按时间进行文件的排序。 最快速度查看到最近更新
ls -r 文件名反向逆序,大到小。 直接 ls -l看的话是小到大 数字 A-Z
方法3:awk过滤以d开头
ls -l ./home | awk '/^d'
3、只能保留最近 7 天的访问日志
代码语言:javascript复制find /application/logs/ -type f -mtime 7 -name "*.log"|xargs rm –f
##也可以使用-exec rm -f {} ;进行删除
4、打印行号及内容
cat -n nginx.conf grep -n . 1.sh
5、系统运行级别
0 关机 1 单用户 2 多用户,没有nfs支持 3 完全多用户, 4 保留 5 X Windows 6 重启
6、如何优化Linux系统
1、不用root,添加普通用户,通过sudo授权管理 2、更改默认的远程连接SSH服务端口及禁止root用户远程连接 3、定时自动更新服务器时间 4、配置国内yum源 5、关闭selinux及iptables(iptables工作场景如果有外网IP一定要打开,高并发除外) 6、调整文件描述符的数量 7、精简开机启动服务(crond rsyslog network sshd) chkconfig –list 8、内核参数优化(/etc/sysctl.conf) 9、更改字符集,支持中文,但建议还是用英文字符集,防止乱码 echo $LANG 10、锁定关键系统文件 chattr i i表示不得任意更动文件或目录 11、清空/etc/issue,去除系统及内核版本登录前的屏幕显示
7、解压压缩
-P或–absolute-names 文件名使用绝对名称,不移除文件名称前的”/”号。 -c是打包,-x是解包 -z,-j是压缩和解压缩
a.请用 tar 打包/etc 整个目录(打包及压缩) 打包及压缩:tar zcvf etc.tar /etc b.请用 tar 打包/etc 整个目录(打包及压缩,但需要排除/etc/services 文件) 打包及压缩:tar zcvf etc.tar.gz /etc –exclude=/etc/services c.请把 a 点命令的压缩包,解压到/tmp 指定目录下 解压:tar zxvf etc.tar.gz -C /opt/
第八周
1、过滤字符串 I am kolor, myqq is 3302 ,过滤出kolor和3302
代码语言:javascript复制无逗号 I am kolor myqq is 3302
awk '{print $3" "$6}' 1.txt
cut -d" " -f3,6 1.txt
cut -c 6-11,20- 1.txt
有逗号 I am kolor, myqq is 3302
awk '{print $3" "$6}' 1.txt | sed s#,#""#
2、查看/etc/services 文件内容有多少行?
wc -l /etc/services cat -n /etc/services | tail -1 | awk ‘{print 1}’ awk ‘{print NR}’ /etc/services|tail -1 grep -n /etc/services|tail -1
3、过滤出/etc/services 文件包含 3306 或 1521 两数据库端口的行的内容。
grep -E “3306|1521” /etc/services
4、描述 linux 系统从开机到登陆界面的启动过程
开机自检,MBR引导,加载grub菜单,在grub菜单里面加载kernel,启动init进程,init是Linux系统启动时第一个启动的进程,init读取inittab文件,先执行/etc/rc.d/rc.sysinit初始化脚本(设置主机名,加载inittab,设置网卡和一些PCI设备),根据inittab设置的级别指向相对应的脚本,如果是3模式则指向/etc/rc3.d下面的脚本以及程序,执行rc.local,最后启动mingetty进程,进入登陆界面。
5、如何取得/kolor 文件的权限对应的数字内容,如-rw-r–r– 为 644, 要求使用命令取得644 这样的数字。
stat kolor | sed -n ‘4p’ | awk ‘{print 2}’ | tr -cd “[0-9]” stat kolor | awk -F “[(/]” ‘NR==4 {print 2}’ stat -c %a kolor 查看文件属性权限 -c 表示格式化
6、显示指定行内容
第二行
代码语言:javascript复制sed -n '2p' file.test
awk 'NR==2 {print $0}' file.test
第三行至第五行内容
代码语言:javascript复制sed -n '3,5p' file.test
awk '{if(NR>2&&NR<6) print $0}' file.test
显示奇数行与偶数行 sed
代码语言:javascript复制[root@test1 test]# sed -n '1~2p' file.test
1
3
5
7
9
[root@test1 test]# sed -n '2~2p' file.test
2
4
6
8
10
[root@test1 test]# sed -n 'p;n' file.test
1
3
5
7
9
[root@test1 test]# sed -n 'n;p' file.test
2
4
6
8
10
awk
代码语言:javascript复制[root@test1 test]# awk 'NR%2==1' file.test
1
3
5
7
9
[root@test1 test]# awk 'NR%2==0' file.test
2
4
6
8
10
[root@test1 test]# awk '{if(NR%2==1) print $0}' file.test
1
3
5
7
[root@test1 test]# awk '{if(NR%2==0) print $0}' file.test
2
4
6
8
10
显示匹配到的行
代码语言:javascript复制[root@test1 test]# sed -n '/5/p' file.test
5 line 5
[root@test1 test]# awk '/5/' file.test
5 line 5
[root@test1 test]# grep 5 file.test
5 line 5
7、查找当前目录下所有文件,并把文件中的 www.baidu.com 字符串替换成 www.abc.cc
代码语言:javascript复制find ./ -type f|xargs sed -i 's#www.baidu.com#www.abc.cc#g'
第九周
1、sudo su 和 su
sudo su – 该命令是通过sudo权限进行角色转换(默认是切换到root),输入的是指向命令当时账号的密码,而非root密码。 当前用户暂时申请root权限,sudo是用户申请管理员权限执行一个操作,而此处的操作就是变成管理员。 su – 该命令是真正用户切换命令(默认是切换到root),输入的是root的密码
2、如何把文件中的空行过滤掉
方法一:简单粗暴
代码语言:javascript复制grep -v "^$" test.txt
sed '/^$/d' test.txt
awk /[^^$]/ test.txt
awk '!/^$/' test.txt
注:
^$表示空行。
Grep -v 表示排除。
Sed //d 表示删除
Awk !// 表示排除或取反。
方法2:考虑到可能有空格方法
代码语言:javascript复制grep -v "^[ ]*$" test.txt
sed '/^[ ]*$/d' test.txt
awk '!/^[ ]*$/' test.txt
说明:
[ ]*表示连续出现0个或多个空格,表示0个的时候就相当于是^$即空行。
方法3:考虑到可能有空格或tab键
代码语言:javascript复制sed '/^[ t]*$/d' kolor.txt
awk '!/^[ t]*$/' kolor.txt
说明:
Grep命令默认不支持t表示tab键。
这里面我们用sed和awk方法即可。
3、查看命令路径
whereis -b ifconfig whcih ifconfig
4、查看哪些用户在线的linux命令
w who
5、关机重启注销
关机
代码语言:javascript复制# shutdown -h now --->立刻关机(生产常用)
# shutdown -h 1 --->1分钟后关机
# init 0
# halt
# poweroff
重启
代码语言:javascript复制# reboot
# shutdown -r now
# shutdown -r 1
注销
代码语言:javascript复制# logout
6、分时日月周crontab
每天晚上12点 0 0 * * *
每天的23点整 0 23 * * *
每隔两小时 * */2 * * *
7、下列路径的内容
/etc/sysctl.conf —–>内核调优的文件 /etc/rc.local —–>开机自启动命令的文件 /etc/hosts —–>本机的域名解析文件 /etc/fstab —–>开机设备自动挂载的文件 /var/log/secure —–>系统登陆的安全日志
第十周
1、如何查看用户的 uid 及属于的组信息。
[root@aliyun ~]# id kolor uid=1010(kolor) gid=1010(kolor) groups=1010(kolor)
2、添加一个用户kolor,并指定属于 sa 组,要求组 ID 为 801, uid 为 808,并且不建立家目录及禁止其登陆。
代码语言:javascript复制# groupadd sa -g 801
# useradd kolor -g sa -s /sbin/nologin -M
# id kolor
uid=1010(kolor) gid=1010(kolor) groups=1010(kolor)
3、mysql主从原理?主从不同步怎么办?主从慢,差的多咋办?
①mysql主从原理: 从库生成两个线程,一个I/O线程,一个SQL线程; i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中; 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog; SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;
②主从不同怎么办 先上Master库: mysql>show processlist; 查看下进程是否Sleep太多。发现很正常。 show master status; 也正常。 mysql> show master status; 再到Slave上查看 mysql> show slave statusG Slave_IO_Running: Yes Slave_SQL_Running: No
可见是Slave不同步 下面介绍两种解决方法: 方法一:忽略错误后,继续同步 该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 解决: stop slave; #表示跳过一步错误,后面的数字可变 set global sql_slave_skip_counter =1; ❤
方式二:重新做主从,完全同步 1.先进入主库,进行锁表,防止数据写入 使用命令: mysql> flush tables with read lock; ❤ 注意:该处是锁定为只读状态,语句不区分大小写 2.进行数据备份 #把数据备份到mysql.bak.sql文件 [root@server01 mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql 这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失 4.把mysql备份文件传到从库机器,进行数据恢复 #使用scp命令 [root@server01 mysql]# scp mysql.bak.sql root@192.168.128.101:/tmp/ 5.停止从库的状态 mysql> stop slave; 6.然后到从库执行mysql命令,导入数据备份 mysql> source /tmp/mysql.bak.sql 7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项 change master to master_host = ‘192.168.128.100’, master_user = ‘rsync’, master_port=3306, master_password=’’, master_log_file = ‘mysqld-bin.000001’, master_log_pos=3260; 8.重新开启从同步 mysql> start slave; 9.查看同步状态 mysql> show slave statusG 查看:
③主从慢,差的多咋办 1.从库硬件比主库差,导致复制延迟 2.主从复制单线程,如果主库写并发太大,来不及传送到从库,就会导致延迟。更高版本的mysql可以支持多线程复制 3.慢SQL语句过多 4.网络延迟 5.master负载 主库读写压力大,导致复制延迟,架构的前端要加buffer及缓存层 6.slave负载 一般的做法是,使用多台slave来分摊读请求,再从这些slave中取一台专用的服务器,只作为备份用,不进行其他任何操作 另外,2个可以减少延迟的参数: –slave-net-timeout=seconds 单位为秒。默认设置为 3600秒 #参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据 –master-connect-retry=seconds 单位为秒。 默认设置为 60秒 #参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试。
4、mount永久挂载
vi /etc/fstab UUID=904C23B64C23964E /media/aborn/data ntfs defaults 0 2 其中第一列为UUID, 第二列为挂载目录(该目录必须为空目录,必须存在),第三列为文件系统类型,第四列为参数,第五列0表示不备份,最后一列必须为2或0(除非引导分区为1)
5、打印一个目录下所有包含字符串A的行
代码语言:javascript复制grep -rn "A" ./
-n 行号
-r 目录递归
或
find ./ -name "*.*" | xargs grep "A"
6、iptables
iptables有4表5链: filter表——过滤数据包 Nat表——用于网络地址转换(IP、端口) Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS Raw表——决定数据包是否被状态跟踪机制处理
INPUT链——进来的数据包应用此规则链中的策略 OUTPUT链——外出的数据包应用此规则链中的策略 FORWARD链——转发数据包时应用此规则链中的策略 PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理) POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
★7、页面无法访问排查思路
场景一:无错误状态码 若是云服务器可能存在账号处于欠费状态 WEB服务没有启动 端口没有正常监听 防火墙或者防火墙策略限制 排查思路说明: ·使用命令telnet IP Port 进行测试
场景二:网站访问异常代码4XX。 排查思路: 通过查看其配置文件,并检测其配置文件语法,发现语法正常; 通过命令行查看其web服务端口运行正常,没有进程僵尸状况; 具体读配置文件,然后再查找客户客户配置文件所指定的具体目录 ·404报错的具体原因是访问的路径url目录在服务上没有找到,如果直接使用ip或者域名访问,那么实际访问的页面是站点根目录下的默认文件(配置文件中index后指定的文件),如果服务器上站点根目录上没有这个文件,则会出现404错误。
第十一周
1.sed用法 1
代码语言:javascript复制cat /tmp/passwd
koloredu.com
123456789
kolor
oldgirl
1)删除文件每行的第二个字符 方法一:
代码语言:javascript复制[root@kolorEdu tmp]# sed 's#.##2' passwd
odboyedu.com
13456789
odboy
odgirl
方法二:
代码语言:javascript复制[root@kolorEdu tmp]# sed -r 's#(.).(.*)#12#g' passwd
odboyedu.com
13456789
odboy
odgirl
2)把所有小写字母用括号()括起来
代码语言:javascript复制[root@kolorEdu tmp]# sed 's#[a-z1-9]#(&)#g' passwd
(o)(l)(d)(b)(o)(y)(e)(d)(u).(c)(o)(m)
(1)(2)(3)(4)(5)(6)(7)(8)(9)
(o)(l)(d)(b)(o)(y)
(o)(l)(d)(g)(i)(r)(l)
字符(&)的用法
代码语言:javascript复制"s/^AA.*/&XX" : 把所有以AA开头的行,在行尾假设XX,其中的字符(&)表示所有以AA开头的字符串。
满足匹配的字符串文本内容
$ echo "AABB" | sed "s/AA/AAXX/g"
AAXXBB
$ echo "AABB" | sed "s/AA/&XX/g"
AAXXBB
例子3. 给所有的连续字符A加后缀XX
这个怎么写呢,如果不用字符(&)好像不方便,因为不确定有多少个A字符。
$ echo "AAABB" | sed "s/A /XX/g"
XXBB 这样是不正确的
使用字符(&)
$ echo "AAABB" | sed "s/A /&XX/g"
AAAXXBB
2.取出/tmp目录下面的10个文件的第一行
在目录/tmp下找到10个以abc开头的文件,然后把这些文件的第一行内容保存到文件new中
代码语言:javascript复制cat /server/scripts/find.sh
#!/bin/sh
for filename in `find /tmp -type f -name "abc*"|head -n 10`
do
sed -n '1p' $filename>>new
done
3.通过Iptables来限定apache每秒钟连接数为1,峰值为3
iptables -A INPUT -d 172.16.100.1 -p tcp --dport -m limit --limit 1/second --limit-burst 3 -j ACCEPT
4.假设Apache 产生的日志文件名为access_log,在apache 正在运行时,执行命令mv access_log access_log.bak,执行完后,请问新的apache 的日志会打印到哪里,为什么?
新的日志会打印在access_log.bak 中,因为apache 启动时会找access_log 文件,随时准备向文件中加入日志信息,虽然此时文件被改名,但是由于服务正在运行,因为它的inode 节点的位置没有变,程序打开的fd 仍然会指向原来那个inode,不会因为文件名的改变而改变。apache 会继续向已改名的文件中追加日志,但是若重启apache 服务,系统会检查access_log文件件是否存在,若不存在则创建。
5.实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网
方法一:echo 1 > /proc/sys/net/ipv4/ip_forward
代码语言:javascript复制echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 124.32.54.26
方法二:在内核参数文件/etc/sysctl.conf中增加如下内容net.ipv4.ip_forward = 1,然后执行:sysctl -p
如果不是固定的124.32.54.26怎么办?
代码语言:javascript复制解答:我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
第十二周
1.优化shell脚本
代码语言:javascript复制#!/bin/bash
grep kolor /etc/passwd &>/dev/null
REVAL=$?
if [ $REVAL -eq 0 ]
then
echo "kolor user already exists"
else
useradd kolor
fi
参考答案一:
代码语言:javascript复制#!/bin/bash
if grep -q kolor /etc/passwd
then
echo "kolor user already exists"
else
useradd kolor
fi
加-q选项,执行结果是:如果找到了,会返回0,否则,返回1。
参考答案二:
代码语言:javascript复制[ `grep kolor /etc/passwd|wc -l` -eq 1 ]&& echo ok ||echo no
2.如何让linux也像windows那样有一个回收站,避免数据的误删除,进而恢复误删数据?
-i:默认选项,当目标文件存在时,提示是否覆盖 @表示所有参数 #表示所有参数的个数 把下面这些代码放到一个tr.sh脚本,然后在 .bashrc下添加 source /root/tr.sh (每一次更改都要重新执行.bashrc) 或 直接 cat >> .bashrc <<EOF
代码语言:javascript复制#!/bin/bash
mkdir -p ~/.trash #创建一个目录作为回收站,这里使用的是用户家目录下的.trash目录
cat >> .bashrc
alias rm=trash #命令别名 rm改变为trash,通过将rm命令别名值trash来实现把rm改造成删除文件至回收站
alias r=trash
alias rl='ls ~/.trash' # rl命令显示回收站中的文件
alias ur=undelfile # ur命令找回回收站中的文件
alias cl=cleartrash # cl命令清空回收站中的文件
代码语言:javascript复制说明:这个函数的作用是找回回收站下的文件
undelfile(){
mv -i ~/.trash/$@ ./
}
-i:默认选项,当目标文件存在时,提示是否覆盖
代码语言:javascript复制说明:这个函数是将指定的文件移动到指定的目录下,通过将rm命令别名值trash来实现把rm改造成删除文件至回收站
trash(){
mv $@ ~/.trash/
}
代码语言:javascript复制说明:这个函数的作用是清空回收站目录下的所有文件
cleartrash(){
read -p "clear sure?[n]" confirm
[ $confirm == 'y' ] || [ $confirm == 'Y' ] && /bin/rm -rf ~/.trash/*
}
这段代码定义了三个函数trash、undelfile和cleartrash。 trash的作用是移动文件到指定的回收站目录; undelfile的作用是找回回收站目录中的指定文件; cleartrash的作用是清空回收站目录。 经rm命令别名为trash来实现rm命令的改造!
trash目录作为回收站,将其它代码加入用户家目录下的.bashrc文件下,这样用户每次登录这段代码就会自动生效! 登录后在bash下执行一遍下面的命令就可以把rm命令改造成删除文件到回收站了!
最终脚本,直接执行通过EOF就会写到.bashrc,注意这种直接写的话要$转义。通过路径调用脚本就不用
代码语言:javascript复制mkdir -p ~/.trash
cat >> .bashrc <<EOF alias rm=trash alias rl='ls ~/.trash' alias ur=undelfile alias cl=cleartrash undelfile() { mv -i ~/.trash/$@ ./ } trash() { mv $@ ~/.trash/ } cleartrash(){ read -p "clear sure?" confirm [ $confirm == 'y' ] || [ $confirm == 'Y' ] && /bin/rm -rf ~/.trash/* } EOF
3.基础娱乐命令:像幻灯片一样播放每个字符
如何实现执行一个命令,让文字字符,采用输入回放的效果,逐一显示在屏幕上
代码语言:javascript复制echo "Kolor,网工,运维" | pv -qL 20
#没有这个命令 yum 安装即可
yum install pv -y #需要使用epel源
4.批量重命名,文件批量重命名为 00.jpg ……10.jpg
代码语言:javascript复制# touch {00..10}.html
# ls
00.html 01.html 02.html 03.html 04.html 05.html 06.html 07.html 08.html 09.html 10.html
方法一:rename命令
代码语言:javascript复制rename .html .jpg *.html
方法二:shell
代码语言:javascript复制for name in `ls *.html`;do mv $name ${name%.html}.jpg;done
${file%.*}: 删掉最后一个 . 及其右边的字符串
方法三:shell
代码语言:javascript复制for n in {
00..10};do mv $n.html $n.jpg ;done
5./etc/profile /etc/bashrc .bashrc .bash_profile的区别
全局环境变量 ↓ /etc/profile 主要用是系统的环境变量,同时我们也放些别名 /etc/bashrc 主要用来存放系统的别名和自己定义的函数(都可以放到 /etc/profile中)
只针对当前登陆的用户生效 ↓ .bashrc 是用户自己定义的别名 .bash_profile 是用户自己定义的环境变量
先读取/etc/profile文件,然后读取用户自己的.bash_profile然后读取.bashrc的内容最后读取/etc/bashrc这个文件。 这是这几个文件在用户登录的时候的运行的顺序。 /etc/profile ——》 .bash_profile ——》 .bashrc ——》 /etc/bashrc
6.如何修改主机名
临时修改:hostname test 永久修改: 方法一:vim /etc/sysconfig/network
代码语言:javascript复制# Created by anaconda
NETWORKING=yes
HOSTNAME=test
GATEWAY=192.168.1.137
让主机名能解析 (ping 主机名可以畅通) ip地址 主机名 放入到/etc/hosts 10.0.0.200 test
方法二:还有一种存在vim /etc/hostname
代码语言:javascript复制test
第十三周
1.命令风暴:打印出001 002 003 这样的格式的数字
方法1:{}生成序列
代码语言:javascript复制[root@shell ~]# echo 00{1..3}
001
002
003
方法2:seq法
代码语言:javascript复制[root@shell ~]# seq -w 100
001
002
003
004
005
006
007
…………
[root@shell ~]# seq -w 100 |sed -n '1,3p'
001
002
003
————
[root@shell ~]# seq -w 101 103|sed -e 's/^1/0/g'
001
002
003
[root@shell ~]# seq -f g 3
001
002
003
-f, --format=格式 使用printf 样式的浮点格式
%3g那么数字位数不足部分是空格。
"g" 数字位数不足部分是0,%前面制定字符串。
-s, --separator=字符串 使用指定字符串分隔数字(默认使用:n)
[root@Gin scripts]# seq -s '=' 1 5
1=2=3=4=5
方法3:for循环
代码语言:javascript复制[root@shell ~]# for ((i=1;i<=3;i=i 1));do echo 00$i;done
001
002
003
[root@shell ~]# for ((i=1;i<=3;i=i 1));do printf "dn" $i;done
001
002
003
方法4:sed命令中&命令用法,增加或修改一个字符串。
代码语言:javascript复制[root@shell ~]# seq 3|sed 's/^[0-9]/00&/g'
001
002
003
方法5:sed命令中()和1的用法。
代码语言:javascript复制[root@shell ~]# seq 3|sed 's/(^[0-9])/001/g'
001
002
003
2.如何实现 Nginx 代理的节点访问日志记录客户的 IP 而不是代理的 IP?
使用proxy反向代理模块中的proxy_set_header参数
proxy_set_header X-Forwarded-For $remote_addr;
3.❤IDC 机房带宽突然从平时 100M 增加到 400M,请你分析问题所在并解决
该故障的影响:直接导致数百台服务器无法连接,该机房全部业务中断。 首先会反射为DDOS问题,结果解决时间加长了,如果能提前做好预案,恢复速度可能就会好很多
分析问题 1)IDC带宽被占满的原因很多,常见的有: a.真实遭受DDOS攻击 b.内部服务器中毒,大量外发流量 c.网站元素(如图片)被盗连,在门户页面被推广导致大量流量产生 d.合作公司来抓数据,如:对合作单位提供了API数据接口 e.购买了CDN业务,CDN猛抓源站 f.其他原因
2)CDN带宽异常,源站没异常。 这类问题基本都是缓存在CDN的数据被频繁访问引起的。
3) CDN带宽异常,源站也异常。 可能原因如公司做推广,大量数据访问,热点数据cache里不全。或CDN问题导致数据回源(有关CDN回源率问题及提升回源率经验,以后再和大家分享)。影响就是带宽高,后端静态服务器及图片及存储压力大
解决问题 a.如何防止DDOS ①HTTP请求拦截 如果恶意请求有特征,对付起来很简单:直接拦截它就行了。 HTTP 请求的特征一般有两种:IP 地址和 User Agent 字段。比如,恶意请求都是从某个 IP 段发出的,那么把这个 IP 段封掉就行了。或者,它们的 User Agent 字段有特征(包含某个特定的词语),那就把带有这个词语的请求拦截。
拦截可以在三个层次做。 (1)专用硬件 Web 服务器的前面可以架设硬件防火墙,专门过滤请求。这种效果最好,但是价格也最贵。 (2)本机防火墙 操作系统都带有软件防火墙,Linux 服务器一般使用 iptables。比如,拦截 IP 地址1.2.3.4的请求,可以执行下面的命令。
代码语言:javascript复制$ iptables -A INPUT -s 1.2.3.4 -j DROP
(3)Web 服务器
Web 服务器也可以过滤请求。拦截 IP 地址1.2.3.4,nginx 的写法如下。
代码语言:javascript复制location / {
deny 1.2.3.4;
}
Apache 的写法是在.htaccess文件里面,加上下面一段。
代码语言:javascript复制<RequireAll>
Require all granted
Require not ip 1.2.3.4
</RequireAll>
如果想要更精确的控制(比如自动识别并拦截那些频繁请求的 IP 地址),就要用到 WAF。
②带宽扩容 HTTP 拦截有一个前提,就是请求必须有特征。但是,真正的 DDOS 攻击是没有特征的,它的请求看上去跟正常请求一样,而且来自不同的 IP 地址,所以没法拦截。这就是为什么 DDOS 特别难防的原因。 带宽扩容 CDN 指的是网站的静态内容分发到多个服务器,用户就近访问,提高速度。因此,CDN 也是带宽扩容的一种方法,可以用来防御 DDOS 攻击。
网站内容存放在源服务器,CDN 上面是内容的缓存。用户只允许访问 CDN,如果内容不在 CDN 上,CDN 再向源服务器发出请求。这样的话,只要 CDN 够大,就可以抵御很大的攻击。不过,这种方法有一个前提,网站的大部分内容必须可以静态缓存。对于动态内容为主的网站(比如论坛),就要想别的办法,尽量减少用户对动态数据的请求。 Coudflare 是一个免费 CDN 服务,并提供防火墙。
b.如何防止盗链 方法1:判断引用地址(判断浏览器请求时HTTP头的Referer字段的值) 当你的网站程序接收到下载 jacky.mp3 资源请求的时候,先判断http的referer字段的值,如果在对方域名上请求该资源则认为不合法,如果是从 自己的域名(uushare.com)过来的,则可以认为是合法的连接请求,否则就返回一个错误的提示信息。 配置apache服务器。用于图片防盗链(使用url重写)
代码语言:javascript复制1.#LoadModule rewrite_module modules/mod_rewrite.so
把#去掉,重启apache
2.在需要防盗的网站或者目录下,写 .htaccess 文件(windows下不能直接创建,可以另存)
并指定防盗链规则,分析referer信息,如果不是来自本站,则重写
重写规则 .htaccess 文件
1.哪种情况重写规则
是jpeg/gif/png图片的时候
是referer头与localhost不匹配的时候
2.如何重写
统一 rewrite 到某个防盗链图片上
RewriteEngine On
//只是在改页面下生效
Rewrite Base /HTTPxieyi/day1
//会对以下格式的文件进行重写规则
RewriteCond %{
REQUEST_FILENAME} .*.(jpg|jpeg|gif|png) [NC]
//如果不是来自localhost的用户,会重写
RewriteCond %{
HTTP_REFERER} !localhost [NC]
//会重写到blog网的logo上
RewriteRule .* http://www.blog/picture/1.png
方法2:使用登录验证 这个方法常见于论坛、社区。当访客请求网站上的一个资源时,先判断此请求是否通过登录验证(在asp.net里常用session或form验证来记录登录状态),如果尚未登录则返回一个错误提示信息。使用这个方法还可以进一步判断登录的用户的权限是否足够,以实现带“权限”的下载。 这种方法的另外一个缺点是访客无法匿名下载,所以这个方法一般只用于论坛和社区网站。
方法3:使用图形验证码 使用这个方法可以保证每次下载都是“人”在你的网站上下载,而不是下载工具。
4.发现文件系统只读了,是什么原因?如何解决?
目前已知造成硬盘分区只读的可能原因有: 文件系统错误 内核相关硬件驱动bug 磁盘坏道 HBA卡故障 RAID卡故障
解决方法:使用fsck命令检查文件系统错误
1.重启系统后看看是否可以自动恢复
2.使用fdisk修复
检查 msdos 档案系统的 /dev/hda5 是否正常,如果有异常便自动修复 :
fsck -t msdos -a /dev/hda5
3.卸载只读的分区,然后重新mount挂载
mount -o remount,rw /
5.binlog是什么?记录的什么?有几种工作模式及企业应用场景
binlog:是用于记录所有更新了数据的操作语句,语句以事件的形式保存,它描述数据的更改过程 作用:用于实时备份数据,数据库的主从复制 log_bin 打开记录binlog功能
binlog的查看
代码语言:javascript复制mysqlbinlog /home/mysql/binlog/binlog.000003
binlog的删除:可分为自动与手动删除 自动删除 能过binlog参数expire_logs_days来实现
代码语言:javascript复制show binary logs;
show variables like "expire_logs_days";
set gloable expire_logs_days=3;
手工删除
代码语言:javascript复制reset master 删除主的binlog
reset slave 删除从的中继日志
三种模式: Row level模式 : 日志会记录每一行数据被修改的形式,然后在从端对相同的数据进行修改 优点:可以不记录执行SQL语句上下文相关的信息,只记录哪一条数据被修改,修改成什么样了 缺点:所有执行的语句都当记录到日志文件中,而且都会以每行记录的修改来记录,会产生大量的日志内容
statement模式: 每一条修改数据的SQL都会记录master的bin-log中,slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL来执行 优点:解决了上row level模式的缺点,不需要记录每一行数据的变化,减少日志量,可以得高性能 缺点:由于记录的是执行语句,在此模式下会有主从无法复制的问题出现
mixed自动模式: MYSQL会根据执行的每一条具体SQL语句来区分对待记录的日志格式,
企业使用场景: 1)如果不会用到mysql特殊的功能,基本都是默认的模式statement模式 2)如果会到mysql的一些特殊功能,基本都是会使用row level模式
第十四周
1.两个文件,把第一个文件中的第2、3行内容添加到第二个文件的第3行后面
代码语言:javascript复制[root@kolor ~]# cat 1.txt
111
222
333
[root@kolor ~]# cat 2.txt
AAA
bbb
ccc
ddd
修改后
[root@kolor ~]# cat 2.txt
AAA
bbb
ccc
222
333
ddd
代码语言:javascript复制[root@kolor ~]# sed -i "3a$(sed -n '2,3p' 1.txt |xargs |sed 's# #\n#g')" 2.txt
[root@kolor ~]# cat 2.txt
AAA
bbb
ccc
222
333
ddd
xargs 会把 换行的变成 222 333
3a加进去,默认是按n分割. 所以要替换空格为n
2.脚本直接执行没有问题,在定时任务中有问题,什么原因?
就是没有找到ifconfig,与PATH环境变量有关,PATH环境变量在/etc/profile文件中设置,而定时任务却是以nologin方式调用脚本,不会加载/etc/profile,所以导致此脚本在定时任务中执行失败
方法1:在脚本中ifconfig 命令写全路径 /sbin/ifconfig 方法2:在脚本中加入 source /etc/profile
3.nfs客户端挂载信息写入/etc/fstab中,系统重启,没有自动挂载是什么原因?
客户端挂载: mount -t nfs 10.0.0.101:/data /mnt 挂载信息写入 /etc/fstab 内容如下 10.0.0.101:/data /mnt nfs defaults 0 0
原因:分析一下linux启动过程就知道了,系统启动时,执行挂载操作的时候,网络服务还没有启动,而nfs挂 载需要网络服务
解决方法:
1、 系统启动时,同时启动netfs
chkconfig netfs on
2、 挂载命令写入
/etc/rc.local
4.Nginx需要优化哪些内容?
1.gzip压缩优化 2.expires缓存优化 3.网络IO事件模型优化 4.隐藏软件名称和版本号 5.防盗链优化 6.禁止恶意域名解析 7.禁止通过IP地址访问网站。 8.HTTP请求方法优化。 9.防DOS攻击单IP并发连接的控制,与连接速率控制。 10.严格设置Web站点目录的权限。 11.将Nginx进程以及站点运行于监牢模式(nginx服务降权启动(不能使用80端口,使用其他端口,例如8080)、站点目录设置普通用户)。 12.通过robot协议以及HTTP_USER_AGENT防爬虫优化 13.配置错误页面根据错误码指定网页反馈给用户 14.Nginx日志相关优化 访问日志切割轮询、不记录指定元素日志、最小化日志目录权限。 15.限制上传到资源目录的程序被访问,防止木马入侵系统破坏文件。 16.FastCGI参数buffer和cache以及超时等的优化。 17.php.ini和php-fpm.conf配置文件的优化。 18.有关Web服务的linux内核方面深度优化(网络连接、IO、内存等)。 19.Nginx加密传输优化(SSL)。 20.Web服务器磁盘挂载及网络文件系统优化。 21.使用Nginx cache。 22.nginx WAF(nginx lua) 安全。
5.企业生产MySQL如何优化?
代码语言:javascript复制a:硬件的优化:
1、采用64位cpu,cpu至少4颗,L2缓存越大越好
2、内存要大,32-64G运行1-2个实例,96-128G运行3-4个实例
3、机械盘选用sas盘,转速15000以上,用可能的话使用ssd
4、raid卡使用raid10
5、网卡多块,千兆以上
6、数据库不要使用虚拟化,slave硬件要好于master
b:操作系统优化
1、操作系统选择x86_64位,尽量采用xfs文件系统
2、优化磁盘存储参数
3、优化内核参数
4、优化网络等
c:mysql构架优化
1、根据内存大小,配置服务器跑多实例
2、主从复制采用mixed模式,尽量不要跨机房同步,若要跨机房,尽量采用远程写,本地读
3、定期检查、修复主从复制的数据差异
4、业务拆分,搜索功能不使用MySQL数据库执行;某些高并发,安全性一般的业务使用nosql,如:memcache、 redis等
5、数据库前端加cache,如memcache,用于用户登录,商品查询
6、动态数据静态化,整个文件静态化,页面片段静态化
7、数据库集群读写分离,一主多从,通过dbproxy进行集群读写分离
8、单表超过800万,拆库拆表,如人工将(登录、商品、订单)拆表拆库
9、选择从库备份,并且对数据库进行分表分库备份
d:MySQL数据库层面优化
1、优化my.cnf参数
2、优化库表设计,包括字符集、字符串长度、创建短索引、多用复合索引;
3、SQL语句优化,减少慢语句数量;
e:数据库管理流程、制度优化
1、人的流程:开发—>核心运维/DBA
2、测试流程:内网 IDC测试线上执行
3、客户端管理,PHPMYADMIN
f:MySQL数据库安全优化
1、数据库禁止设置外网
2、数据库文件权限优化;
3、授权用户权限限制,尽量专库专用户
4、限制开发对生产库的操作权限
5、防止SQL语句注入
第十五周
1.显示/etc/inittab中以#开头,且后面跟了一个或多个空白字符,而后又跟了任意非空白字符的行
正则表达式中 s代表一个空白字符(可能是空格、制表符、其他空白) -P 可以让grep使用perl的正则表达式语法 方法一:grep/egrep
代码语言:javascript复制egrep "^#[[:blank:]] [^[:blank:]]*" /etc/inittab
grep -P "^#[ t] [^ t]*" /etc/inittab
grep -P "^#s S " /etc/inittab
方法二:sed
代码语言:javascript复制sed -n '/^#[[:blank:]] [^[:blank:]]*/p' /etc/inittab
sed -n '/^#[ t] [^ t]*/p' /etc/inittab
sed -nr '/^#s S /p' /etc/inittab
方法三:awk
代码语言:javascript复制awk '/^#[[:blank:]] [^[:blank:]]*/' /etc/inittab
awk '/^#[ t] [^ t]*/' /etc/inittab
awk '/^#s S /' /etc/inittab
2.对输入的脚本文件进行语法检查;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本;
要求文件名以传参的方式进行传入,从标准输入中读取,文件名后缀是”.sh”
代码语言:javascript复制#!/bin/bash
#
read -p "Please input check script: " file
if [ -f $file ];then
sh -x $file >/dev/null 2>&1
if [ $? -ne 0 ];then
read -p "You input script $file syntax error.[Type Q|q to exit or Type vim to edit]" answer
case $answer in
Q|q)
exit 0
;;
*)
vim $file
;;
esac
fi
fi
3.根据要求写出itpables防火墙规则
iptables支持time时间控制用户行为,如有请写出具体操作步骤,限制在每个星期一的0点0分0秒到23点59分59秒这个时间段内,所有icmp协议报文的应答都会拒绝。
代码语言:javascript复制iptables -A INPUT -p ICMP --icmp-type 8 -m time --timestart 00:00:00 --timestop 23:59:59 --weekdays Mon -j DROP
icmp 8 是请求
icmp 0 是应答
4.显示出打印第二列为kolor行的第一列内内容
[root@kolorEdu kolor# cat ip.log 10.0.0.1 kolor 10.0.0.2 oldgirl 10.0.0.3 bingbing 10.0.0.4 tingting 10.0.0.4 kolor 打印第二列为kolor行的第一列内容
方法一:while循环
代码语言:javascript复制while read line
do
name=`echo $line|awk '{print $2}'`
if [ "$name" = "kolor" ];then
echo $line|awk '{print $1}'
fi
done </kolor/ip.log
方法二:grep [root@show kolor]# grep -Po “S s(?=kolor)” ip.txt 10.0.0.1 10.0.0.4 [root@show kolor]# grep -Po “[0-9. ] (?=kolor)” ip.txt 10.0.0.1 10.0.0.4 -o:只显示与正则表达式匹配的部分。 s 表格,换行等空白区域 S 非空白区域 () 将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符 零宽断言
- 零宽度正预测先行断言 (?=exp)匹配exp前面的位置 例:bw (?=ingb),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配sing和danc。
方法三:sed ?
代码语言:javascript复制sed -nr '/kolor/ s#(^[^ ] ).*$#1#gp' ip.sh
方法四:awk
代码语言:javascript复制awk '$2~/kolor/{print $1}' ip.sh
~是匹配的意思,找出包含kolor的
https://www.cnblogs.com/-beyond/p/9254007.html
5.权限拒绝 常见的permission denied 原因
- 显示目录里面的内容 需要kolor用户对这个目录要有r和x的权限。
- 删除一个文件需要kolor用户对这个文件的上一级目录 拥有w和x权限。 因为文件名实际存放在目录的block中。所以kolor用户要删除/etc/passwd 实际上是删除/etc/目录block的信息。
- 对于修改文件的内容,要看kolor用户对这个文件是否有r和w的权限。
第十六周
1.shell脚本知识点:不影响脚本运行的前提下,对脚本进行加密 方法一:shc shc -r -f script-name 注意:要有-r选项, -f 后跟要加密的脚本名. 运行后会生成两个文件,script-name.x 和 script-name.x.c script-name.x是加密后的可执行的二进制文件. ./script-name 即可运行. script-name.x.c是生成script-name.x的原文件(c语言)
方法二:gzexe 2.shell脚本知识点:书写脚本完成ftp上传下载 FTP如果有些文件需要每天定时进行上传或下载,人为重复相同工作也是没有意义的 因此如何编写自动下载或上传FTP文件脚本?
ftpput.sh 上传文件到ftp脚本
代码语言:javascript复制#!/bin/sh
#FileName:ftpput.sh
#Function:从本地客户端向ftp服务器上传一个文件
#Version:V0.1
#Author:
#Date:
# $#表示传递给此Shell脚本的参数个数
# -ne表示不等于
if [ $# -ne 2 ]
then
echo "Usage $0 <local_dir/filename> <remote_dir>"
exit 1
fi
说明:如果传递的参数个数不等于2个,即提示传参报错信息
# IP表示ftp的服务器ip地址
IP=127.0.0.1
#IP=192.168.6.1
# FULLNAME获取本地文件全路径名
FULLNAME=$1
# DESTDIR获取需要上传的ftp远程目录路径
DESTDIR=$2
# basename返回一个路径中的文件名部分
# 如FULLNAME="/home/Sunrier/Proj/log/test.log";
# 当local_filename=`basename $FULLNAME`
# 最终local_filename="test.log"
local_filename=`basename $FULLNAME`
# DESTFILE表示ftp服务器的路径,以及保存后的文件名
DESTFILE=$DESTDIR/$local_filename
# 自动上传文件到ftp服务器,免交互方式
ftp -i -n <<FTPIT open $IP user Sunrier redhat bin passive cd /home/remote/log/ftpfile put $FULLNAME $DESTFILE quit FTPIT
exit 0
ftpget.sh 下载文件到ftp客户端脚本
代码语言:javascript复制#FileName:ftpget.sh
#Function:从ftp服务器上下载一个文件到本地计算机上
#Version:V0.1
#Author:
#Date:
# $#表示传递给此Shell脚本的参数个数
# -ne表示不等于
if [ $# -ne 2 ]
then
echo "Usage $0 <remote_dir/filename> <local_dir>"
exit 1
fi
# IP表示ftp的服务器ip地址
IP=127.0.0.1
#IP=192.168.6.1
# FULLNAME获取从ftp服务器上下载的文件全路径名
FULLNAME=$1
# DESTDIR获取从ftp服务器上下载的文件所存放的本地计算机的目录路径
DESTDIR=$2
# remote_filename获取从ftp服务器上下载的文件名
remote_filename=`basename $FULLNAME`
# DESTFILE表示下载文件所存放的本地路径,以及本地保存后的文件名
DESTFILE=$DESTDIR/$remote_filename
ftp -i -n <<FTPIT open $IP user Sunrier redhat bin cd /home/remote/log/ftpfile get $FULLNAME $DESTFILE quit FTPIT
exit 0
3.网络并发,并发与架构设计基础知识
想建设一个能承受500万PV/每天的网站吗? 500万PV是什么概念? 服务器每秒要处理多少个请求才能应对?如何计算呢? PV是什么:PV是page view的简写。PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv。
日均IP/ PV 访问量约为600 / 2400的意思是,今天访问首页次数为2400次,访问IP为600个。也就是说这600个IP一共访问首页2400次。
代码语言:javascript复制计算模型:
每台服务器每秒处理请求的数量=((80%*总PV量)/(24小时*60分*60秒*40%)) / 服务器数量 。
其中关键的参数是80%、40%。表示一天中有80%的请求发生在一天的40%的时间内。24小时的40%是9.6小时,有80%的请求发生一天的9.6个小时当中(很适合互联网的应用,白天请求多,晚上请求少)。
简单计算的结果:
4000000/34560/1=115.7
((80%*500万)/(24小时*60分*60秒*40%))/1 = 115.7个请求/秒
((80%*100万)/(24小时*60分*60秒*40%))/1 = 23.1个请求/秒
初步结论:
现在我们在做压力测试时,就有了标准,如果你的服务器一秒能处理115.7个请求,就可以承受500万PV/每天。
如果你的服务器一秒能处理23.1个请求,就可以承受100万PV/每天。
留足余量:
以上请求数量是均匀的分布在白天的9.6个小时中,但实际情况并不会这么均匀的分布,会有高峰有低谷。为了应对高峰时段,应该留一些余地,最少也要x2倍,x3倍也不为过。
115.7个请求/秒 *2倍=231.4个请求/秒
115.7个请求/秒 *3倍=347.1个请求/秒
23.1个请求/秒 *2倍=46.2个请求/秒
23.1个请求/秒 *3倍=69.3个请求/秒
最终结论:
如果你的服务器一秒能处理231.4--347.1个请求/秒,就可以应对平均500万PV/每天。
如果你的服务器一秒能处理46.2--69.3个请求,就可以应对平均100万PV/每天。
说明:
这里说明每秒N个请求,就是QPS。因为我关心的是应用程序处理业务的能力。
带宽、硬件
4.虚拟机使用知识点: vmware centos7虚拟机克隆系统如何修改网卡设置?
代码语言:javascript复制1、克隆虚拟机,克隆前需关闭虚拟机
2、克隆之后的网卡问题解决,其中需要修改HWADDR ❤ 和UUID
/etc/sysconfig/network-scripts/ifcfg-ens32
uuid获取:用命令 nmcli con show 获取
mac地址获取:从虚拟机的属性里获取
5.❤shell知识点:shell脚本中字符串截取
假设有变量 var=http://www.koloredu.com/123.htm.
代码语言:javascript复制1. # 号截取,删除左边字符,保留右边字符。
变量: var=http://www.koloredu.com/123.htm
echo ${
var#*//}
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.koloredu.com/123.htm
2. ## 号截取,删除左边字符,保留右边字符。
变量: var=http://www.koloredu.com/123.htm
echo ${
var##*/}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.koloredu.com/
结果是 :123.htm
3. %号截取,删除右边字符,保留左边字符
变量: var=http://www.koloredu.com/123.htm
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
即删除 /123.htm
结果是:http://www.koloredu.com
4. %% 号截取,删除右边字符,保留左边字符
变量: var=http://www.koloredu.com/123.htm
echo ${var%%/*}
%%/* 表示从右边开始,删除最后一个 / 号及右边的字符
即删除 //www.koloredu.com/123.htm.
结果是:http:
5. :x:y格式表示取字符串信息,从左边第x 1个字符开始,及取出字符的y个数
变量: var=http://www.koloredu.com/123.htm
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
即取值 从字符串的0字符取值h,取5个字符,到字符:(冒号)
结果是:http:
6. :y格式表示取字符串信息,从左边第y 1个字符开始,一直到结束。
变量: var=http://www.koloredu.com/123.htm
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
即取值 从字符串的第7位/之后取值,知道字符串结束
结果是 :www.koloredu.com/123.htm
7. :x-y:z格式表示取字符串信息,其中x-y表示字符串的取值范围,从右边第x-y位个字符取值,及取字符的z个字符数
变量: var=http://www.koloredu.com/123.htm
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
即取值 0-7从字符串右边取7位,然后再从左边取前3位
PS:特殊说明
①当1-7时,表示0-7取7位,但从最左边的取值中减去1位,即var=987654321 0-7=987654321 1-7=87654321
②当7-7时,表示0-7取7位,但从最左边的取值中减去7位,即var=987654321 0-7=987654321 7-7=987654321
③当取值的范围小于输出的字符数时,将全部输出,即var=987654321 0-3=321 取4位时,显示321
结果是:123
8. :x-y格式表示取字符串信息,其中x-y表示字符串的取值范围,从右边第0个字符开始,一直到y位结束。
变量: var=http://www.koloredu.com/123.htm
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
即取值 0-7从字符串右边取7位
结果是:123.htm
注:(左边的第一个字符是用单个数字字符0表示,右边的第一个字符用 0-1 表示).com/123.htm.
第十七周
1.服务器上有哪些常用的操作系统,各有什么特点?
2.常用的磁盘raid有哪些?描述下原理和区别?
3.如何找出/usr/local 下面所有shell脚本文件,并设置执行权限? 方法1.正常思路版本
代码语言:javascript复制find /usr/local/ -type f -name "*.sh" |xargs chmod x
chmod x ` find /usr/local/ -type f -name "*.sh"`
find /usr/local/ -type f -name "*.sh" -exec chmod x {
} ;
可是这个方法不严谨,因为有的脚本不是以.sh结尾的。
方法2.精确方法
代码语言:javascript复制通过file命令查看文件类型,通过awk、sed、grep过滤出包含shell script的然后授予x权限。
find /usr/local/ -type f |xargs file |awk -F: '/shell.script/{print $1}'|xargs chmod x
chmod x ` find /usr/local/ -type f |xargs file |awk -F: '/shell.script/{print $1}'`
4.Mount挂载/data时出现mount: /data is busy 如何解决? 1.查看是否正在使用中 2.df -h查看下 3.有时候会存在 df -h不会显示出来,可是实际还在挂载 4.这时候 grep “/data” /proc/mounts 来进行查看 5.然后卸载 umount /data 6.卸载失败就强制卸载umount -lf /data 7.然后mount新的设备即可。
- 先umount 再mount
- 如果不行,使用 fuser -km /data
第十八周
1.如何查看linux系统时间?若当前系统时区不是中国,如何修改? 如果不是中国时区,修正方法: CentOS6: cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime CentOS7: timedatectl set-timezone Asia/Shanghai
2.Linux如何设置每天凌晨三点重启nginx服务
代码语言:javascript复制crontab -e
00 03 * * * /application/nginx/sbin/nginx -s reload &>/dev/nul
3.MySQL如何授权用户admin:password远程访问权限 假定内网网段172.16.1.0,用户admin,密码password,数据库kolor。
代码语言:javascript复制只创建用户:
create user 'admin'@'172.16.1.%' identified by 'password'; 创建用户并授权数据库权限,这种方式也是工作中最常用的: grant all privileges on kolor.* to 'admin'@'172.16.1.%' identified by 'password';
4.php-fpm优化关闭危险参数
代码语言:javascript复制1、打开php的安全模式
php的安全模式是个非常重要的php内嵌的安全机制,能够控制一些php中的函数执行,比如system(),同时把被很多文件操作的函数进行了权限控制。
默认关闭,338行
safe_mode = Off
改为
safe_mode = On
2、用户组安全
; By default, Safe Mode does a UID compare check when
; opening files. If you want to relax this to a GID compare,
; then turn on safe_mode_gid.
; http://php.net/safe-mode-gid
safe_mode_gid = Off # php5.3.27默认关闭
3、关闭危险函数
当打开安全模式,函数禁止可以不做,但为了双重保险还是做。比如不执行system()能执行系统命令的函数,或能查看php信息的phpinfo()等函数。方法如下
disable_functions = system,passthru,exec,shell_exec,popen,phpinfo
4、关闭php版本号
php版本号会在http的head里显示
expose_php = On
改为
expose_php = Off
5、关闭注册全局变量
register_globals = Off # 默认关闭,不要打开
6、打开magic_quotes_gpc防止SQL注入
magic_quotes_gpc = Off
改为
magic_quotes_gpc = On
7、错误信息控制
一般php在没有连接到数据库或者其他情况下会有错误提示,一般错误信息中会包含php脚本当前的路径信息或者查询的SQL语句等信息,这类信息在生产环境是不允许的,应禁止。想要错误信息,应该导入日志。
display_errors = Off (默认值,不是改为off)
显示错误级别
error_reporting = E_WARNING & E_ERROR
8、错误日志
log_errors = On
log_errors_max_len = 1024 # Set maximum length of log_errors.
error_log = /app/logs/php_errors.log # 注意写权限
9、资源参数限制优化
# 设置每个脚本运行的最长时间,当无法上传较大的文件或者后台备份数据经常超时,需调整下面参数,单位秒。
max_execution_time = 30
# 每个脚本使用的最大内存
memory_limit = 128M
# 每个脚本等待输入数据最长时间
max_input_time = 60
# 上传文件的最大许可
upload_max_filesize = 2M
10、安全参数优化
# 禁止打开远程地址
allow_url_fopen = On
改为
allow_url_fopen = Off
# 防止Nginx文件类型错误解析漏洞
cgi.fix_pathinfo=0
第十九周
1.find-size参数 ①查找当前目录下以log结尾的大于50k小于2M的普通文件 ②查找当前目录下以log结尾的小于50k大于2M的普通文件
代码语言:javascript复制[root@nfs01 tmp]# find -type f -name "*.log" -size -2M -size 50k
./d.log
./b.log
问题1比较简单,因为所有的查找条件都是与的逻辑
第二个不能直接-o,这样找出来的是不完整的
代码语言:javascript复制[root@nfs01 tmp]# find -type f -name "*.log" -size 2M -o -size -50k
第二个不能直接-o,这样找出来的是不完整的
[root@nfs01 tmp]# find -type f -name "*.log" -size 2M
./c.log
[root@nfs01 tmp]# find -type f -name "*.log" -size -50k
./a.log
分开两条找,然后合并
[root@nfs01 tmp]# find -type f -name "*.log" ( -size 2M -o -size -50k )
./c.log
./a.log
2.linux中一个文件由哪几部分组成? Linux文件系统(如ext2、ext3)中一个文件由目录项(文件名)、inode(元数据) 和 数据组成。
目录项: 文件名 inode(元数据):又称文件索引节点,是文件属性的存放地和数据块指针存放地。 所有与某个文件相关联的额外信息都保存在一个叫做inode的结构中 inode包括 文件类型、权限、硬链接数、所有者及所属组、文件大小、时间信息 数据:文件的具体内容存放地。
目录项、inode、数据三者之间的关系: 一个文件名只能与一个 inode关联,一个inode可以关联多个文件名,inode与数据是一一对应的
Linux文件系统(如ext2、3等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。
3.如何在命令行查询,已安装的php模块 php -m
4.网站访问高峰之后,如何回收已占用的swap分区? [root@kolor ~]# swapoff -a [root@kolor ~]# swapon -a [root@kolor ~]# free -m
5.yum安装软件的时候,记不全包名,如何查找到完整的包名? 方法一:yum search bash 方法二:yum list | grep ^bash
6.出现Swap file….already exists以下错误如何解决? E325: ATTENTION Found a swap file by the name “.a.sh.swp”Swap file “.a.sh.swp” already exists! [O]pen Read-Only, (E)dit anyway, ®ecover, (D)elete it, (Q)uit, (A)bort: 解决方法 1.首先输入R,恢复数据。 2.然后输入D,删除临时文件 3.最后输入:wq!保存文件并退出,此时再次编辑文件就一切正常了
7.提示 “Warning: /dev/root does not exist, could not boot” 解决办法 tracut:/# lvm vgscan tracut:/# lvm vgchange -ay tracut:/# exit
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/130111.html原文链接:https://javaforall.cn