默认生产环境中,三台服务器均可满足访问外网需求;但最终目标是完成服务器01与服务器03之间的不同网段间通讯,即服务器01的10.0.0.10主机IP地址可以正常访问服务器03的10.0.1.10主机IP地址
vmnet8虚拟网配置项:
vmnet1虚拟网配置项:
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服务重启,路由表信息也不会丢失。
①可以通过如下环境变量强制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
#<==此时登录数据库就不用输入密码了。
方法一:可以利用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 注意这是让当前运行的脚本到后台,然后"暂停".运行。
子网卡(别名)
①手工配置别名的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
方法一:top 按内存列排序,x高亮,z加颜色,使用>可以移动到以内存排序
方法二:ps -aux | sort -k4nr | head -3
iptables -t nat -A PREROUTING -d 192.168.133.126 -p tcp --dport 80 -j DNAT --to-des 192.168.133.126:8080
用户要访问www.baidu.com,会先找本机的host文件,再找本地设置的DNS服务器,如果也没有的话,就去网络中找根服务器,根服务器反馈结果,说只能提供一级域名服务器.cn,就去找一级域名服务器,一级域名服务器说只能提供二级域名服务器.com.cn,就去找二级域名服务器,二级域服务器只能提供三级域名服务器.baidu.com.cn,就去找三级域名服务器,三级域名服务器正好有这个网站www.baidu.com,然后发给请求的服务器,保存一份之后,再发给客户端
①进程是资源分配的最小单位,线程是CPU调度的最小单位
②进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
③多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另一个进程造成影响,因为进程有自己独立的地址空间
进程
线程:
IO密集型(不用CPU):多线程
计算密集型(用CPU):多进程
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
光标移动
ctrl + a 切换到命令行开始
ctrl + e 切换到命令行末尾
剪切粘贴
ctrl + u 清除(剪切)光标之前的内容
ctrl + k 清除(剪切)光标之后的内容
ctrl + y 粘贴
esc + f 把光标移动到单词的结尾
esc + f 把光标移动到单词的开头
ctrl + b 光标向左移动一个符号的位置
ctrl + f 光标向右移动一个符号的位置
假如现在有个文本,格式如下:
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
在linux系统中,链接分两种 :一种是硬链接(Hard Link),另一种被称为符号链接或软链接(Symbolic Link)。
默认不带参数情况下,ln命令创建的是硬链接。
处理以下文件内容,将域名取出并根据域名进行计数排序处理:
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
1、主机加电自检,加载BIOS硬件信息
2、读取MBR的引导文件(GRUB、LILO)
3、引导Linux内核
4、运行第一个进程init(进程号永远为1),
5、进入相应的运行级别
6、运行终端,输入用户名和密码
#mkdir dir_xyz
#chmod g+wx dir_xyz
#chmod +t dir_xyz
最后一行命令——权限位最后的 ‘+t’ 是粘滞位,它用来替换x,表明在这个目录中,文件只能被它们的拥有者、目录的拥有者或者是超级用户root删除。
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
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}'
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
①w,显示谁远程登录了系统并且在干什么
②who,显示谁远程登录了
③last,显示最近远程登录的用户,也可以查看已经登录的用户
find /tmp/ -type f -mtime +7 -size +50k -a -size -2M -regex '.*\.log$'
+50k 表示大于50k的文件
-2M 表示小于2M的文件
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
-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
find /tmp/ -type f -name "*.log" -print0 | xargs -0 ls -l
find命令的参数 -print0(注意这是数字0),表示find在找到文件后在文件的结尾加上一个标记,不用默认的空格分隔文件。
加上参数后,find命令找到的每个文件会在文件结尾加上一个标记(空符号)
正巧了,xargs 也有个参数专门识别这个空标记,-0(数字0)。xargs加上–null(等同于-0)参数就可处理空字符
%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
#! /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
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/
[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
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-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;
①/etc/rc.local
②chkconfig -add httpd
chkconfig --list
chkconfig --level 35 mysqld on
网络文件共享服务NFS,仅在3级别上开机自启动
chkconfig --level 3 nfs on
[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可以更精确的控制权限的分配。
比如:让某一个用户对某一个文件具有某种权限。
sed 's#[a-z]#\ug' test.txt
awk '{print toupper($0)}' test.txt
(toupper是awk的内置函数,功能是将小写字母转换为大写,对应的转换成小写的做法是把toupper函数替换成tolower函数)
tr 'a-z' 'A-Z ' < test.txt
iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 873 -j ACCEPT
问题说明:每次复制代码时,如果代码里有 //或# 这样的注释就容易让格式乱掉,显示的内容不整齐,并不是所期望的显示格式
原因分析:是由于vim编辑命令的自动缩进功能所影响,因此粘贴带注释的代码时可以取消自动缩进
vim test.txt #<--编辑一个文件
:set paste #<--在vim的命令行模式输入,关闭vim缩进功能
:set nopaste #<--开启vim缩进功能
比较方便的方法就是修改用户家目录下的 .vimrc配置文件:
set pastetoggle=<F9>
以后在插入模式下,只要按F9键就可以快速切换自动缩进模式了
说起缩进,/etc/vimrc
用vim打开vimrc文件并增加下面两行代码
set tabstop=4
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
[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##*/}
##*/ 表示 删除最后一个/ 及其左边字符串
参考答案:
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数量消耗会更快。
200 服务器成功返回网页
301 永久跳转,请求的网页已永久跳转到新位置。
403 禁止访问,服务器拒绝请求
404 服务器找不到请求的页面
500 内部服务器错误
502 错误网关,一般是网关服务器请求后端服务时,后端服务不可用或者没有完成响应网关服务器。
503 服务当前不可用,可能因为服务器超载或停机维护导致。 或者是代理服务器后面没有可以提供服务的节点
504 网关超时,一般是服务器过载导致没有在指定时间内返回数据给代理服务器
①开机时手要快按任意键
②grub菜单,按e键
③选择第二项,按e键
④在rhgb quiet最后加"空格",然后键入"1"或"s"或"S"或"single"都可以,按回车键返回上一层
⑤按b键启动系统,进入到单用户模式
⑥passwd 修改root密码
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`" ] && \#注意前面的过滤条件结尾带有空格。这里啊,是为了排除下面的重复情况
—————————————————————————————————
例:默认: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 把分隔符替换成冒号
题目解析:
1、/var/log/下所有文件包括当前目录和子目录以及子目录的子目录下面的文件
2、linux下文件有很多类型,包括 普通文件、链接文件、字符设备文件、块设备文件、socket文件等
find /var/log/ ! -type d | wc -l
74
tree /var/log/ | awk 'END{print $3}'
74
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
方法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'
find /application/logs/ -type f -mtime +7 -name "*.log"|xargs rm –f
##也可以使用-exec rm -f {} \;进行删除
cat -n nginx.conf
grep -n . 1.sh
0 关机
1 单用户
2 多用户,没有nfs支持
3 完全多用户,
4 保留
5 X Windows
6 重启
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,去除系统及内核版本登录前的屏幕显示
-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/
无逗号 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#,#""#
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
grep -E “3306|1521” /etc/services
开机自检,MBR引导,加载grub菜单,在grub菜单里面加载kernel,启动init进程,init是Linux系统启动时第一个启动的进程,init读取inittab文件,先执行/etc/rc.d/rc.sysinit初始化脚本(设置主机名,加载inittab,设置网卡和一些PCI设备),根据inittab设置的级别指向相对应的脚本,如果是3模式则指向/etc/rc3.d下面的脚本以及程序,执行rc.local,最后启动mingetty进程,进入登陆界面。
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 表示格式化
第二行
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
find ./ -type f|xargs sed -i 's#www\.baidu\.com#www\.abc\.cc#g'
sudo su - 该命令是通过sudo权限进行角色转换(默认是切换到root),输入的是指向命令当时账号的密码,而非root密码。 当前用户暂时申请root权限,sudo是用户申请管理员权限执行一个操作,而此处的操作就是变成管理员。
su - 该命令是真正用户切换命令(默认是切换到root),输入的是root的密码
方法一:简单粗暴
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方法即可。
whereis -b ifconfig
whcih ifconfig
w
who
关机
# shutdown -h now --->立刻关机(生产常用)
# shutdown -h +1 --->1分钟后关机
# init 0
# halt
# poweroff
重启
# reboot
# shutdown -r now
# shutdown -r +1
注销
# logout
每天晚上12点
0 0 * * *
每天的23点整
0 23 * * *
每隔两小时 * */2 * * *
/etc/sysctl.conf —–>内核调优的文件
/etc/rc.local —–>开机自启动命令的文件
/etc/hosts —–>本机的域名解析文件
/etc/fstab —–>开机设备自动挂载的文件
/var/log/secure —–>系统登陆的安全日志
[root@aliyun ~]# id kolor
uid=1010(kolor) gid=1010(kolor) groups=1010(kolor)
# groupadd sa -g 801
# useradd kolor -g sa -s /sbin/nologin -M
# id kolor
uid=1010(kolor) gid=1010(kolor) groups=1010(kolor)
①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秒
#参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试。
vi /etc/fstab
UUID=904C23B64C23964E /media/aborn/data ntfs defaults 0 2
其中第一列为UUID, 第二列为挂载目录(该目录必须为空目录,必须存在),第三列为文件系统类型,第四列为参数,第五列0表示不备份,最后一列必须为2或0(除非引导分区为1)
grep -rn "A" ./
-n 行号
-r 目录递归
或
find ./ -name "*.*" | xargs grep "A"
iptables有4表5链:
filter表——过滤数据包
Nat表——用于网络地址转换(IP、端口)
Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
Raw表——决定数据包是否被状态跟踪机制处理
INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
场景一:无错误状态码
若是云服务器可能存在账号处于欠费状态
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
在目录/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
iptables -A INPUT -d 172.16.100.1 -p tcp --dport -m limit --limit 1/second --limit-burst 3 -j ACCEPT
新的日志会打印在access_log.bak 中,因为apache 启动时会找access_log 文件,随时准备向文件中加入日志信息,虽然此时文件被改名,但是由于服务正在运行,因为它的inode 节点的位置没有变,程序打开的fd 仍然会指向原来那个inode,不会因为文件名的改变而改变。apache 会继续向已改名的文件中追加日志,但是若重启apache 服务,系统会检查access_log文件件是否存在,若不存在则创建。
方法一: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
#!/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
-i:默认选项,当目标文件存在时,提示是否覆盖 这段代码定义了三个函数trash、undelfile和cleartrash。 trash目录作为回收站,将其它代码加入用户家目录下的.bashrc文件下,这样用户每次登录这段代码就会自动生效! 最终脚本,直接执行通过EOF就会写到.bashrc,注意这种直接写的话要$转义。通过路径调用脚本就不用 如何实现执行一个命令,让文字字符,采用输入回放的效果,逐一显示在屏幕上 方法一:rename命令 方法二:shell 全局环境变量 ↓ 只针对当前登陆的用户生效 ↓ 先读取/etc/profile文件,然后读取用户自己的.bash_profile然后读取.bashrc的内容最后读取/etc/bashrc这个文件。 临时修改:hostname test 让主机名能解析 (ping 主机名可以畅通) 方法二:还有一种存在vim /etc/hostname 方法1:{}生成序列 方法2:seq法 方法3:for循环 方法4:sed命令中&命令用法,增加或修改一个字符串。 方法5:sed命令中()和\1的用法。 使用proxy反向代理模块中的proxy_set_header参数 该故障的影响:直接导致数百台服务器无法连接,该机房全部业务中断。 分析问题 2)CDN带宽异常,源站没异常。 3) CDN带宽异常,源站也异常。 解决问题 拦截可以在三个层次做。 (3)Web 服务器 Web 服务器也可以过滤请求。拦截 IP 地址1.2.3.4,nginx 的写法如下。 Apache 的写法是在.htaccess文件里面,加上下面一段。 如果想要更精确的控制(比如自动识别并拦截那些频繁请求的 IP 地址),就要用到 WAF。 ②带宽扩容 网站内容存放在源服务器,CDN 上面是内容的缓存。用户只允许访问 CDN,如果内容不在 CDN 上,CDN 再向源服务器发出请求。这样的话,只要 CDN 够大,就可以抵御很大的攻击。不过,这种方法有一个前提,网站的大部分内容必须可以静态缓存。对于动态内容为主的网站(比如论坛),就要想别的办法,尽量减少用户对动态数据的请求。 Coudflare 是一个免费 CDN 服务,并提供防火墙。 b.如何防止盗链 方法2:使用登录验证 方法3:使用图形验证码 目前已知造成硬盘分区只读的可能原因有: 解决方法:使用fsck命令检查文件系统错误 binlog:是用于记录所有更新了数据的操作语句,语句以事件的形式保存,它描述数据的更改过程 binlog的查看 binlog的删除:可分为自动与手动删除 手工删除 三种模式: statement模式: mixed自动模式: 企业使用场景: 就是没有找到ifconfig,与PATH环境变量有关,PATH环境变量在/etc/profile文件中设置,而定时任务却是以nologin方式调用脚本,不会加载/etc/profile,所以导致此脚本在定时任务中执行失败 方法1:在脚本中ifconfig 命令写全路径 /sbin/ifconfig 客户端挂载: 原因:分析一下linux启动过程就知道了,系统启动时,执行挂载操作的时候,网络服务还没有启动,而nfs挂 载需要网络服务 1.gzip压缩优化 1.显示/etc/inittab中以#开头,且后面跟了一个或多个空白字符,而后又跟了任意非空白字符的行 正则表达式中 \s代表一个空白字符(可能是空格、制表符、其他空白) 方法二:sed 方法三:awk 要求文件名以传参的方式进行传入,从标准输入中读取,文件名后缀是”.sh” iptables支持time时间控制用户行为,如有请写出具体操作步骤,限制在每个星期一的0点0分0秒到23点59分59秒这个时间段内,所有icmp协议报文的应答都会拒绝。 [root@kolorEdu kolor# cat ip.log 方法一:while循环 方法二:grep 方法三:sed 方法四:awk 1.shell脚本知识点:不影响脚本运行的前提下,对脚本进行加密 方法二:gzexe ftpput.sh 上传文件到ftp脚本 ftpget.sh 下载文件到ftp客户端脚本 想建设一个能承受500万PV/每天的网站吗? 500万PV是什么概念? 日均IP/ PV 访问量约为600 / 2400的意思是,今天访问首页次数为2400次,访问IP为600个。也就是说这600个IP一共访问首页2400次。 假设有变量 1.服务器上有哪些常用的操作系统,各有什么特点? 方法2.精确方法 4.Mount挂载/data时出现mount: /data is busy 如何解决? 1.如何查看linux系统时间?若当前系统时区不是中国,如何修改? 2.Linux如何设置每天凌晨三点重启nginx服务 3.MySQL如何授权用户admin:password远程访问权限 4.php-fpm优化关闭危险参数 1.find-size参数 第二个不能直接-o,这样找出来的是不完整的 2.linux中一个文件由哪几部分组成? 目录项: 文件名 目录项、inode、数据三者之间的关系: Linux文件系统(如ext2、3等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。 3.如何在命令行查询,已安装的php模块 4.网站访问高峰之后,如何回收已占用的swap分区? 5.yum安装软件的时候,记不全包名,如何查找到完整的包名? 6.出现Swap file….already exists以下错误如何解决? 7.提示 “Warning: /dev/root does not exist, could not boot” 解决办法
$@表示所有参数
$#表示所有参数的个数
把下面这些代码放到一个tr.sh脚本,然后在 .bashrc下添加 source /root/tr.sh (每一次更改都要重新执行.bashrc)
或
直接 cat >> .bashrc <#!/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的作用是清空回收站目录。
经rm命令别名为trash来实现rm命令的改造!
登录后在bash下执行一遍下面的命令就可以把rm命令改造成删除文件到回收站了!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 .html .jpg *.html
for name in `ls *.html`;do mv $name ${name%.html}.jpg;done
${file%.*}: 删掉最后一个 . 及其右边的字符串
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/bashrc6.如何修改主机名
永久修改:
方法一:vim /etc/sysconfig/network# Created by anaconda
NETWORKING=yes
HOSTNAME=test
GATEWAY=192.168.1.137
ip地址 主机名 放入到/etc/hosts
10.0.0.200 testtest
第十三周
1.命令风暴:打印出001 002 003 这样的格式的数字
[root@shell ~]# echo 00{1..3}
001
002
003
[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
[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
[root@shell ~]# seq 3|sed 's/^[0-9]/00&/g'
001
002
003
[root@shell ~]# seq 3|sed 's/\(^[0-9]\)/00\1/g'
001
002
003
2.如何实现 Nginx 代理的节点访问日志记录客户的 IP 而不是代理的 IP?
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.其他原因
这类问题基本都是缓存在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
location / {
deny 1.2.3.4;
}
HTTP 拦截有一个前提,就是请求必须有特征。但是,真正的 DDOS 攻击是没有特征的,它的请求看上去跟正常请求一样,而且来自不同的 IP 地址,所以没法拦截。这就是为什么 DDOS 特别难防的原因。
带宽扩容
CDN 指的是网站的静态内容分发到多个服务器,用户就近访问,提高速度。因此,CDN 也是带宽扩容的一种方法,可以用来防御 DDOS 攻击。
方法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
这个方法常见于论坛、社区。当访客请求网站上的一个资源时,先判断此请求是否通过登录验证(在asp.net里常用session或form验证来记录登录状态),如果尚未登录则返回一个错误提示信息。使用这个方法还可以进一步判断登录的用户的权限是否足够,以实现带“权限”的下载。
这种方法的另外一个缺点是访客无法匿名下载,所以这个方法一般只用于论坛和社区网站。
使用这个方法可以保证每次下载都是“人”在你的网站上下载,而不是下载工具。4.发现文件系统只读了,是什么原因?如何解决?
文件系统错误
内核相关硬件驱动bug
磁盘坏道
HBA卡故障
RAID卡故障
1.重启系统后看看是否可以自动恢复
2.使用fdisk修复
检查 msdos 档案系统的 /dev/hda5 是否正常,如果有异常便自动修复 :
fsck -t msdos -a /dev/hda5
3.卸载只读的分区,然后重新mount挂载
mount -o remount,rw /
5.binlog是什么?记录的什么?有几种工作模式及企业应用场景
作用:用于实时备份数据,数据库的主从复制
log_bin 打开记录binlog功能mysqlbinlog /home/mysql/binlog/binlog.000003
自动删除
能过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语句上下文相关的信息,只记录哪一条数据被修改,修改成什么样了
缺点:所有执行的语句都当记录到日志文件中,而且都会以每行记录的修改来记录,会产生大量的日志内容
每一条修改数据的SQL都会记录master的bin-log中,slave在复制的时候SQL进程会解析成和原来master端执行过的相同的SQL来执行
优点:解决了上row level模式的缺点,不需要记录每一行数据的变化,减少日志量,可以得高性能
缺点:由于记录的是执行语句,在此模式下会有主从无法复制的问题出现
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.脚本直接执行没有问题,在定时任务中有问题,什么原因?
方法2:在脚本中加入 source /etc/profile3.nfs客户端挂载信息写入/etc/fstab中,系统重启,没有自动挂载是什么原因?
mount -t nfs 10.0.0.101:/data /mnt
挂载信息写入 /etc/fstab 内容如下
10.0.0.101:/data /mnt nfs defaults 0 0
解决方法:
1、 系统启动时,同时启动netfs
chkconfig netfs on
2、 挂载命令写入
/etc/rc.local
4.Nginx需要优化哪些内容?
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语句注入
第十五周
-P 可以让grep使用perl的正则表达式语法
方法一:grep/egrepegrep "^#[[:blank:]]+[^[:blank:]]*" /etc/inittab
grep -P "^#[ \t]+[^ \t]*" /etc/inittab
grep -P "^#\s+\S+" /etc/inittab
sed -n '/^#[[:blank:]]+[^[:blank:]]*/p' /etc/inittab
sed -n '/^#[ \t]+[^ \t]*/p' /etc/inittab
sed -nr '/^#\s+\S+/p' /etc/inittab
awk '/^#[[:blank:]]+[^[:blank:]]*/' /etc/inittab
awk '/^#[ \t]+[^ \t]*/' /etc/inittab
awk '/^#\s+\S+/' /etc/inittab
2.对输入的脚本文件进行语法检查;如果有错误,则提醒用户键入Q或者q无视错误并退出,其它任何键可以通过vim打开这个指定的脚本;
#!/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 -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行的第一列内内容
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 read line
do
name=`echo $line|awk '{print $2}'`
if [ "$name" = "kolor" ];then
echo $line|awk '{print $1}'
fi
done </kolor/ip.log
[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 非空白区域
() 将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符
零宽断言
例:\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I’m singing while you’re dancing.时,它会匹配sing和danc。
?sed -nr '/kolor/ s#(^[^ ]+).*$#\1#gp' ip.sh
awk '$2~/kolor/{print $1}' ip.sh
~是匹配的意思,找出包含kolor的
https://www.cnblogs.com/-beyond/p/9254007.html
5.权限拒绝 常见的permission denied 原因
因为文件名实际存放在目录的block中。所以kolor用户要删除/etc/passwd 实际上是删除/etc/目录block的信息。第十六周
方法一: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语言)
2.shell脚本知识点:书写脚本完成ftp上传下载
FTP如果有些文件需要每天定时进行上传或下载,人为重复相同工作也是没有意义的
因此如何编写自动下载或上传FTP文件脚本?#!/bin/sh
#FileName:ftpput.sh
#Function:从本地客户端向ftp服务器上传一个文件
#Version:V0.1
#Author:
#Date:
# $#表示传递给此Shell脚本的参数个数
# -ne表示不等于
if [ $# -ne 2 ]
then
echo "Usage $0
#FileName:ftpget.sh
#Function:从ftp服务器上下载一个文件到本地计算机上
#Version:V0.1
#Author:
#Date:
# $#表示传递给此Shell脚本的参数个数
# -ne表示不等于
if [ $# -ne 2 ]
then
echo "Usage $0
3.网络并发,并发与架构设计基础知识
服务器每秒要处理多少个请求才能应对?如何计算呢?
PV是什么:PV是page view的简写。PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv。计算模型:
每台服务器每秒处理请求的数量=((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.
第十七周
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结尾的。
通过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}'`
1.查看是否正在使用中
2.df -h查看下
3.有时候会存在 df -h不会显示出来,可是实际还在挂载
4.这时候 grep “/data” /proc/mounts 来进行查看
5.然后卸载 umount /data
6.卸载失败就强制卸载umount -lf /data
7.然后mount新的设备即可。
第十八周
如果不是中国时区,修正方法:
CentOS6:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
CentOS7:
timedatectl set-timezone Asia/Shanghaicrontab -e
00 03 * * * /application/nginx/sbin/nginx -s reload &>/dev/nul
假定内网网段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';
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
第十九周
①查找当前目录下以log结尾的大于50k小于2M的普通文件
②查找当前目录下以log结尾的小于50k大于2M的普通文件[root@nfs01 tmp]# find -type f -name "*.log" -size -2M -size +50k
./d.log
./b.log
问题1比较简单,因为所有的查找条件都是与的逻辑
[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
Linux文件系统(如ext2、ext3)中一个文件由目录项(文件名)、inode(元数据) 和 数据组成。
inode(元数据):又称文件索引节点,是文件属性的存放地和数据块指针存放地。
所有与某个文件相关联的额外信息都保存在一个叫做inode的结构中
inode包括 文件类型、权限、硬链接数、所有者及所属组、文件大小、时间信息
数据:文件的具体内容存放地。
一个文件名只能与一个 inode关联,一个inode可以关联多个文件名,inode与数据是一一对应的
php -m
[root@kolor ~]# swapoff -a
[root@kolor ~]# swapon -a
[root@kolor ~]# free -m
方法一:yum search bash
方法二:yum list | grep ^bash
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!保存文件并退出,此时再次编辑文件就一切正常了
tracut:/# lvm vgscan
tracut:/# lvm vgchange -ay
tracut:/# exit