Bootstrap

运维面试题(每日一题)

每日一题

第一周

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

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后,再输入带密码的命令的前面加一个空格登录,登录命令不会被记录到历史记录里。

[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。

<==配置文件开头添加如下三行,无需重启系统。
[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的方法

ifconfig eth0:1 10.0.0.100 netmask 255.255.255.224 up
route add -host 10.0.0.100 dev eth0        
###---增加一条主机路由,可选配置

②手工查看 ifconfig
③手工删除别名VIP的方法

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一致

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的方法

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的方法

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

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、将一个文本的奇数行和偶数行合并

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、光标

光标移动
ctrl + a 切换到命令行开始
ctrl + e 切换到命令行末尾

剪切粘贴
ctrl + u 清除(剪切)光标之前的内容
ctrl + k 清除(剪切)光标之后的内容
ctrl + y 粘贴
esc + f 把光标移动到单词的结尾
esc + f 把光标移动到单词的开头
ctrl + b 光标向左移动一个符号的位置
ctrl + f 光标向右移动一个符号的位置

4、累计相加

假如现在有个文本,格式如下:
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
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、数组统计

处理以下文件内容,将域名取出并根据域名进行计数排序处理:
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
思路:
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地址信息

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最喜欢的

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结尾的文件

find /tmp/ -type f -mtime +7 -size +50k -a -size -2M  -regex '.*\.log$'

+50k 表示大于50k的文件
-2M  表示小于2M的文件

7、查找出/tmp目录下面修改时间是7天以前,大小在50k到2M之间,并以.log结尾的文件,把这些文件复制到/data目录中

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复制到出问题的用户

-bash-4.1$whoami
kolor
-bash-4.1$cp /etc/skel/.bash* ~
重新登录测试
-bash-4.1$logout
su - kolor

2、如何删除多个文件中包含的空格或其他特殊字符,怎么做

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}’
完整脚本:

#!/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 "监控报警" [email protected] < $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秒钟访问百度首页,如果能够正常打开则记录正常日志,如果出现异常则发邮件报警。

#! /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`" [email protected]
    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、如何统计脚本执行的时间?

[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和每个地址访问的次数

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.手动删除

删除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.设置自动删除

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文件里面所有字母都转换成大写

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端口

iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 873 -j ACCEPT

6、vim命令粘贴带#号或注释信息格式会出现混乱情况,有什么方法进行解决?

问题说明:每次复制代码时,如果代码里有 //或# 这样的注释就容易让格式乱掉,显示的内容不整齐,并不是所期望的显示格式
原因分析:是由于vim编辑命令的自动缩进功能所影响,因此粘贴带注释的代码时可以取消自动缩进

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有什么区别?

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

[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

# 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 文件里所有的第一列和最后一列位置

例:默认: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 $0tr 把分隔符替换成冒号

7、统计/var/log/下所有文件个数

题目解析:
1、/var/log/下所有文件包括当前目录和子目录以及子目录的子目录下面的文件
2、linux下文件有很多类型,包括 普通文件、链接文件、字符设备文件、块设备文件、socket文件等

find /var/log/ ! -type d | wc -l
74

tree /var/log/ | awk 'END{print $3}'
74

第七周

1、题目:批量添加20个用户,用户名为user1~20,密码为5个随机字符(要求不能使用shell循环语句)

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目录下面目录的子目录及隐藏目录,即只能是一级目录)?

方法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 天的访问日志

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

无逗号  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、显示指定行内容

第二行

sed -n '2p' file.test 
awk 'NR==2 {print $0}' file.test 

第三行至第五行内容

sed -n '3,5p' file.test 
awk '{if(NR>2&&NR<6) print $0}' file.test 

显示奇数行与偶数行
sed

[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

[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

显示匹配到的行

[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

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、如何把文件中的空行过滤掉

方法一:简单粗暴

grep -v "^$" test.txt
sed '/^$/d' test.txt 
awk /[^^$]/ test.txt
awk '!/^$/' test.txt

注:
^$表示空行。
Grep -v 表示排除。
Sed //d 表示删除
Awk !// 表示排除或取反。

方法2:考虑到可能有空格方法

grep -v "^[ ]*$" test.txt
sed  '/^[ ]*$/d' test.txt
awk '!/^[ ]*$/' test.txt
说明:
[ ]*表示连续出现0个或多个空格,表示0个的时候就相当于是^$即空行。

方法3:考虑到可能有空格或tab键

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、关机重启注销

关机

# shutdown -h now   --->立刻关机(生产常用)
# shutdown -h +1    --->1分钟后关机
# init 0
# halt
# poweroff

重启

# reboot 
# shutdown -r now
# shutdown -r +1

注销

# 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,并且不建立家目录及禁止其登陆。

# 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 status\G
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 [email protected]:/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 status\G 查看:

③主从慢,差的多咋办
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的行

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

cat /tmp/passwd
koloredu.com
123456789
kolor
oldgirl

1)删除文件每行的第二个字符
方法一:

[root@kolorEdu tmp]# sed 's#.##2' passwd
odboyedu.com
13456789
odboy
odgirl

方法二:

[root@kolorEdu tmp]# sed -r 's#(.).(.*)#\1\2#g' passwd
odboyedu.com
13456789
odboy
odgirl

2)把所有小写字母用括号()括起来

[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)

字符(&)的用法

"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中

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

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怎么办?

解答:我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成
MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE

第十二周

1.优化shell脚本

#!/bin/bash
grep kolor /etc/passwd &>/dev/null
REVAL=$?
if [ $REVAL -eq 0 ]
then 
    echo "kolor user already exists"
else
    useradd kolor
fi

参考答案一:

#!/bin/bash
if grep -q kolor /etc/passwd
then 
    echo "kolor user already exists"
else
    useradd kolor
fi

加-q选项,执行结果是:如果找到了,会返回0,否则,返回1。

参考答案二:

[ `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

#!/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命令清空回收站中的文件
说明:这个函数的作用是找回回收站下的文件
undelfile(){
    mv -i ~/.trash/\$@  ./
}

-i:默认选项,当目标文件存在时,提示是否覆盖
说明:这个函数是将指定的文件移动到指定的目录下,通过将rm命令别名值trash来实现把rm改造成删除文件至回收站
trash(){
   mv $@   ~/.trash/
}
说明:这个函数的作用是清空回收站目录下的所有文件
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,注意这种直接写的话要$转义。通过路径调用脚本就不用

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.基础娱乐命令:像幻灯片一样播放每个字符

如何实现执行一个命令,让文字字符,采用输入回放的效果,逐一显示在屏幕上

echo "Kolor,网工,运维" | pv -qL 20 
#没有这个命令 yum 安装即可 
yum install pv -y #需要使用epel源

4.批量重命名,文件批量重命名为 00.jpg ……10.jpg

# 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命令

rename .html .jpg  *.html

方法二:shell

for name in `ls *.html`;do mv $name ${name%.html}.jpg;done
${file%.*}:    删掉最后一个  .  及其右边的字符串

在这里插入图片描述
方法三:shell

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

# Created by anaconda
NETWORKING=yes
HOSTNAME=test
GATEWAY=192.168.1.137

让主机名能解析 (ping 主机名可以畅通)
ip地址 主机名 放入到/etc/hosts
10.0.0.200 test

方法二:还有一种存在vim /etc/hostname

test

第十三周

1.命令风暴:打印出001 002 003 这样的格式的数字

方法1:{}生成序列

[root@shell ~]# echo 00{1..3}
001 
002 
003

方法2:seq法

[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 %03g 3
001
002
003

-f, --format=格式 使用printf 样式的浮点格式 
%3g那么数字位数不足部分是空格。
"%03g" 数字位数不足部分是0,%前面制定字符串。

-s, --separator=字符串 使用指定字符串分隔数字(默认使用:\n) 
[root@Gin scripts]# seq -s '=' 1 5
1=2=3=4=5

方法3:for循环

[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 "%03d\n" $i;done
001
002
003

方法4:sed命令中&命令用法,增加或修改一个字符串。

[root@shell ~]# seq 3|sed  's/^[0-9]/00&/g'
001
002
003

方法5:sed命令中()和\1的用法。

[root@shell ~]# seq 3|sed  's/\(^[0-9]\)/00\1/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的请求,可以执行下面的命令。

$ iptables -A INPUT -s 1.2.3.4 -j DROP

(3)Web 服务器

Web 服务器也可以过滤请求。拦截 IP 地址1.2.3.4,nginx 的写法如下。

location / {
  deny 1.2.3.4;
}

Apache 的写法是在.htaccess文件里面,加上下面一段。

<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重写)

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的查看

mysqlbinlog /home/mysql/binlog/binlog.000003

binlog的删除:可分为自动与手动删除
自动删除

能过binlog参数expire_logs_days来实现

show binary logs;
show variables like "expire_logs_days";
set gloable expire_logs_days=3;

手工删除

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行后面

[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
[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如何优化?

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

egrep "^#[[:blank:]]+[^[:blank:]]*" /etc/inittab  
grep -P "^#[ \t]+[^ \t]*" /etc/inittab  

grep -P "^#\s+\S+" /etc/inittab

方法二:sed

sed -n '/^#[[:blank:]]+[^[:blank:]]*/p' /etc/inittab
sed -n '/^#[ \t]+[^ \t]*/p' /etc/inittab  
sed -nr '/^#\s+\S+/p' /etc/inittab

方法三:awk

awk   '/^#[[:blank:]]+[^[:blank:]]*/' /etc/inittab
awk   '/^#[ \t]+[^ \t]*/' /etc/inittab  
awk   '/^#\s+\S+/' /etc/inittab

2.对输入的脚本文件进行语法检查;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本;

要求文件名以传参的方式进行传入,从标准输入中读取,文件名后缀是”.sh”

#!/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协议报文的应答都会拒绝。

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循环

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前面的位置
    例:\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配sing和danc。

方法三:sed
?

sed -nr '/kolor/ s#(^[^ ]+).*$#\1#gp' ip.sh

方法四:awk

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脚本

#!/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客户端脚本

#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次。

计算模型: 
每台服务器每秒处理请求的数量=((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虚拟机克隆系统如何修改网卡设置?

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.

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.正常思路版本

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.精确方法

通过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服务

crontab -e
00 03 * * * /application/nginx/sbin/nginx -s reload &>/dev/nul

3.MySQL如何授权用户admin:password远程访问权限
假定内网网段172.16.1.0,用户admin,密码password,数据库kolor。

只创建用户:
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优化关闭危险参数

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的普通文件

[root@nfs01 tmp]# find -type f -name "*.log" -size -2M  -size +50k
./d.log
./b.log
问题1比较简单,因为所有的查找条件都是与的逻辑

第二个不能直接-o,这样找出来的是不完整的

[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

;