1.1 for循环语句
在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行。 它跟其他的循环,如while循环,最大的不同,是它拥有一个循环计数器,或是循环变数。这使得for循环能够知道在迭代过程中的执行顺序。 1.1.1 shell中的for循环shell中的for 循环与在c中不同,它包含三种形式:第一种结构是列表for 循环;第二种结构就是不带列表的for循环;第三种就类似于C语言。 ① 列表for循环(常用) #!/bin/bashfor i in 取值列表do 循环主体/命令done
② 不带列表for循环(示例) #!/bin/abshecho "惨绿少年的博客是:" for i do echo "$i" done 脚本执行结果 [root@clsn for]# sh for2.sh http://blog.znix.top惨绿少年的博客是:http://blog.znix.top
|
③ 类似C语言的风格(这种用法常在C语语言中使用)
for((exp1;exp2;exp3)) do 指令...done
编写类似C语言风格脚本
for((i=0;i<=3;i++)) do echo $idone
脚本执行过程
1.1.2 不同语言的For循环
Shell中的两种样式
# 样式一:for i in 1 2 3 do echo $idone# 样式二:for i in 1 2 3;do echo $i;done
JAVA
for(int i = 0; i < 5; i++){ //循环语句;}
PHP
for ($i = 0; $i < 5; $i++) { # statements;}
VB
For i = 1 To 5===PASCAL===for not i=1 dobegin i=0; writeln('Go on!');end. '循环语句Next i
swift
var x = 0for i in 1...100{ x += i}print(x)//5050for _ in 1...100{ x += 1}print(x)// 100var box = [1,2,3,4,5]for i in box{ print(i)}/*1 2 3 4 5*/---
1.2 for循环相关练习题
1.2.1 【练习题1】批量生成随机字符文件名案例
使用for循环在/clsn目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串clsn,名称示例如下:
[root@znix C19]# ls /clsnapquvdpqbk_clsn.html mpyogpsmwj_clsn.html txynzwofgg_clsn.html bmqiwhfpgv_clsn.html udrzobsprf_clsn.html vjxmlflawa_clsn.html jhjdcjnjxc_clsn.html qeztkkmewn_clsn.html jpvirsnjld_clsn.html ruscyxwxai_clsn.html
脚本内容
1 [root@clsn for]# cat make_file.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: make_file.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-08 11:01:19 9 # Description:10 #############################################################11 12 [ -d /clsn ] || mkdir -p /clsn13 rpm -qa |grep pwgen &>/dev/null14 if [ $? -eq 1 ] 15 then 16 yum install pwgen -y &>/dev/null17 fi18 19 cd /clsn &&\20 for i in {1..10}21 do22 #File_Name=`uuidgen |tr "0-9-" "a-z"|cut -c 1-10`23 File_Name2=`pwgen -1A0 10`24 touch ${File_Name2}_clsn.html25 done
脚本执行结果
[root@clsn for]# ls -l /clsn -rw-r--r-- 1 root root 0 12月 8 19:41 aegheiriek_clsn.html-rw-r--r-- 1 root root 0 12月 8 19:41 aifohxique_clsn.html-rw-r--r-- 1 root root 0 12月 8 19:41 caexahween_clsn.html-rw-r--r-- 1 root root 0 12月 8 19:41 ciefaivaib_clsn.html-rw-r--r-- 1 root root 0 12月 8 19:41 eixongooph_clsn.html-rw-r--r-- 1 root root 0 12月 8 19:41 foozaivedo_clsn.html-rw-r--r-- 1 root root 0 12月 8 19:41 ireeteethu_clsn.html-rw-r--r-- 1 root root 0 12月 8 19:41 ohmeebivae_clsn.html-rw-r--r-- 1 root root 0 12月 8 19:41 oiceehahth_clsn.html-rw-r--r-- 1 root root 0 12月 8 19:41 sheewaehoo_clsn.html
1.2.2 【练习题2】批量改名特殊案例
【练习题1】中结果文件名中的clsn字符串全部改成znix(最好用for循环实现),并且将扩展名html全部改成大写。
jpvirsnjld_clsn.html ===> jpvirsnjld_znix.HTML
脚本内容:
1 [root@clsn for2]# cat rename_file.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: rename_file.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-08 11:31:56 9 # Description:10 #############################################################11 12 cd /clsn &&\13 File_name=`ls |sed -r 's#(.*)_clsn.html#\1#g'`14 15 for i in $File_name16 do17 if [ -f ${i}_clsn.html ] 18 then19 mv ${i}_clsn.html ${i}_znix.HTML20 else21 echo "文件修改完成."22 exit23 fi24 done
查看结果
[root@clsn for2]# ls /clsn/aeyaesughi_znix.HTML caireasipi_znix.HTML uahahnieli_znix.HTMLaifaepheeb_znix.HTML eathixoong_znix.HTML zalipageen_znix.HTMLakuipheeye_znix.HTML ietoothaik_znix.HTMLapheikieno_znix.HTML lachohtaif_znix.HTML
1.2.2.1 批量改名其他方式
rename 方式(最方便,专业改名)
rename txt jpg *
非 for 循环方式批量改名(使用sed命令进行拼接,然后交给bash执行)
ls *jpg|sed -r 's#(.*).jpg#mv & \1.mp4#'|bash
1.2.3 【练习题3】批量创建特殊要求用户案例
批量创建10个系统帐号clsn01-clsn10并设置密码(密码为随机数,要求字符和数字等混合)。
脚本内容:
1 [root@clsn for2]# cat add_user.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: add_user.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-08 11:52:21 9 # Description:10 #############################################################11 12 Passwd_File=/tmp/`uuidgen`.txt13 >$Passwd_File14 chmod 400 $Passwd_File15 16 for i in clsn{01..10}17 do18 userdel -r "$i" &>/dev/null19 id $i &>/dev/null20 if [ $? -ne 0 ]21 then22 useradd $i23 PassWd=`uuidgen`24 echo $PassWd |passwd --stdin $i &>/dev/null25 echo "用户名:$i 密码:$PassWd" >>$Passwd_File26 echo -e "\033[32m $i 用户创建成功!\033[0m"27 else 28 echo "$i 用户已存在"29 fi30 if [ "$i" == "clsn10" ] 31 then32 echo "用户密码请查看文件 $Passwd_File"33 fi34 done
查看成的密码文件
[root@clsn for2]# cat /tmp/3e5c18d9-f878-4d06-931e-5bbcc810c3dc.txt 用户名:clsn01 密码:3d4644d0-9cf4-49db-8928-1a8346972c32用户名:clsn02 密码:70798c3a-c8e3-42a0-9942-d4011ce4b4b3用户名:clsn03 密码:db2a0f1d-2e49-44f5-a5b2-69b352b30120用户名:clsn04 密码:62d2e0c6-b755-4b00-ad2d-c98f9ca9f258用户名:clsn05 密码:eaa3471b-d04f-4d7c-8b7e-3d75172a483b用户名:clsn06 密码:fb260a11-cd47-4b97-ab49-0cae7a755262用户名:clsn07 密码:16ee7a1f-8aac-4537-b1aa-7fc75beb8754用户名:clsn08 密码:0dde8823-b97d-4c88-9258-3a68a3b53eba用户名:clsn09 密码:daf14ec4-ba9f-4593-9773-1557fdf605dc用户名:clsn10 密码:6f1b452c-00b2-44a1-9f43-5f658d3a9124
脚本执行过程:
1.2.3.1 批量创建用户并设置随机密码(不使用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
方法二
echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\& pass=`echo $RANDOM |md5sum |cut -c 1-5` \&\& echo $pass |passwd --stdin \1 \&\& echo \1 $pass>>/tmp/user_passwd.txt#g'|bash
方法三
echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\& pass=`echo $RANDOM |md5sum |cut -c 1-5` \&\& echo \1:$pass>>/tmp/user_passwd.txt \&\& chpasswd
1.2.4 【练习题4】扫描网络内存活主机案例
写一个Shell脚本,判断10.0.0.0/24网络里,当前在线的IP有哪些?
脚本内容:
1 [root@clsn for]# cat scan_ip2.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: scan_ip.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-07 21:58:47 9 # Description:10 #############################################################11 12 Ip_File=/tmp/scan_ip.txt13 >$Ip_File14 15 for i in 10.0.0.{1..254}16 do17 ping -c 1 -W 1 $i &>/dev/null && \18 if [ $? -eq 0 ] ;then 19 echo "存活主机: $i" &>>$Ip_File20 fi & 21 done22 echo "使用 cat $Ip_File 查看扫描结果"
脚本执行结果
[root@clsn for]# time sh scan_ip2.sh 使用 cat /tmp/scan_ip.txt 查看扫描结果real 0m0.290suser 0m0.001ssys 0m0.039s[root@clsn for]# cat /tmp/scan_ip.txt存活主机: 10.0.0.180存活主机: 10.0.0.254
1.2.5 【练习题5】筛选符合长度的单词案例
利用bash for循环打印下面这句话中字母数不大于6的单词(某企业面试真题)。
I am clsn Welcome to my blog http://blog.znix.top
脚本内容:
1 [root@clsn for]# vim changdu.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: changdu.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-07 22:36:48 9 # Description:10 #############################################################11 12 Word='I am clsn Welcome to my blog http://blog.znix.top'13 14 for i in $Word15 do 16 #[ ${#i} -le 6 ] && echo $i #子串方法17 a=`echo $i |wc -L`18 if [ $a -le 6 ]19 then 20 echo $i21 fi22 done
脚本执行结果
[root@clsn for]# sh changdu.sh Iamclsntomyblog
方法二:
read -p "请输入要判断的语句:" aset -- $afor i in "$@" do if [ ${#i} -le 6 ];then echo "$i" fidone
由 @贰佰 提供
使用expr 计算字符串长度
[root@clsn scripts]# expr length '111'3
1.2.6 【练习题6】破解RANDOM随机数案例
已知下面的字符串是通过RANDOM随机数变量md5sum后,再截取一部分连续字符串的结果,请破解这些字符串对应的使用md5sum处理前的RANDOM对应的数字?
21029299 00205d1c a3da1677 1f6d12dd 890684b
脚本内容
[root@clsn for]# vim pojie.sh #!/bin/bash############################################################## File Name: pojie.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-07 22:41:01# Description:#############################################################md5File=/tmp/Randow_Md5.txtMd5_Word="21029299 00205d1c a3da1677 1f6d12dd 890684b"if [ ! -f $md5File ] then >$md5File for i in {0..32767} do echo `echo $i |md5sum` $i >> $md5File doneelse for num in $Md5_Word do grep $num $md5File donefi
脚本执行结果
[root@clsn for]# sh pojie.sh 2102929901ee1aa769d0f479d7d78b05 - 2566700205d1cbbeb97738ad5bbdde2a6793d - 1346a3da1677501d9e4700ed867c5f33538a - 253451f6d12dd61b5c7523f038a7b966413d9 - 7041890684ba3685395c782547daf296935f - 10082
1.2.7 【练习题7】博客园博文爬虫案例
获取博客园(惨绿少年)博客列表倒序排序考试题
需求如下:
请把https://www.cnblogs.com/clsn/地址中的所有博文,按照时间倒序列表如下:
2017年12月8日 Shell编程基础篇-下
http://www.cnblogs.com/clsn/p/8006210.html
2017年12月7日 memcached 缓存数据库应用实践
http://www.cnblogs.com/clsn/p/7999510.html
高级要求:
生成html页面,并设置超链接。
结果如改网页展示:
脚本内容:
1 [root@clsn htmp]# cat clsn_blog.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: clsn_blog.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-08 21:19:12 9 # Description:10 #############################################################11 12 Uri='http://www.cnblogs.com/clsn/default.html?page='13 14 clsn_Html=/tmp/html/clsn.html15 mkdir -p /tmp/html/16 >$clsn_Html17 18 for i in {1..6}19 do20 curl -s $Uri$i |grep -A 5 'ImageLink' |sed 's#<.*div.*># #g'|sed 's#--##g' >> $clsn_Html21 echo '' >>$clsn_Html22 done
脚本成网页文件
1.2.7.1 51CTO博客爬虫案例
脚本内容
1 [root@clsn html]# cat oldboy_blog.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: oldboy_blog.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-08 22:30:57 9 # Description:10 #############################################################11 12 Uri='http://blog.51cto.com/oldboy/p'13 Blog_Index_File=/tmp/html/oldboy_blog.html14 mkdir -p /tmp/html15 > /tmp/html/oldboy_blog.html16 17 for i in {1..29}18 do19 curl -s $Uri$i |grep -A 5 '发布于' |\20 sed '/^.*zan fr.*/,+2d'|\21 sed 's#^--$##g'|\22 sed 's#发布于:# #g'|\23 sed 's# ##g' >>\24 $Blog_Index_File25 echo ' ' >>$Blog_Index_File26 done
附 文本编码转码
[root@clsn for]# iconv --help用法: iconv [选项...] [文件...]转换给定文件的编码。 输入/输出格式规范: -f, --from-code=名称 原始文本编码 -t, --to-code=名称 输出编码 信息: -l, --list 列举所有已知的字符集 输出控制: -c 从输出中忽略无效的字符 -o, --output=FILE 输出文件 -s, --silent 关闭警告 --verbose 打印进度信息 -?, --help 给出该系统求助列表 --usage 给出简要的用法信息 -V, --version 打印程序版本号长选项的强制或可选参数对对应的短选项也是强制或可选的
常用:
iconv -f gb2312 -t utf-8 -c clsn.html
1.3 while循环语句
在编程语言中,while循环(英语:while loop)是一种控制流程的陈述。利用一个返回结果为布林值(Boolean)的表达式作为循环条件,当这个表达式的返回值为“真”(true)时,则反复执行循环体内的程式码;若表达式的返回值为“假”(false),则不再执行循环体内的代码,继续执行循环体下面的代码。 因为while循环在区块内代码被执行之前,先检查陈述是否成立,因此这种控制流程通常被称为是一种前测试循环(pre-test loop)。相对而言do while循环,是在循环区块执行结束之后,再去检查陈述是否成立,被称为是后测试循环。 |
|
1.3.1 shell中while语法
while 条件 do 命令done
1.3.2 while 使用场景
多用于创建守护进程
【示例1】:while实现web服务器搭建
脚本代码
[root@clsn scripts]# vim web_view.sh #!/bin/bash############################################################## File Name: web_view.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-11 10:07:24# Description:#############################################################while true do echo "ok" | nc -l 81done
客户端进行访问测试
[root@clsn html]# curl 10.0.0.180:81ok
服务端显示结果:
[root@clsn scripts]# sh web_view.sh GET / HTTP/1.1User-Agent: curl/7.29.0Host: 10.0.0.180:81Accept: */*
【示例2】:while创建定时任务
脚本内容:
#!/bin/bashwhile true do uptime sleep 0.6done
脚本执行结果
[root@clsn while]# sh while1.sh 15:01:52 up 2 days, 6:02, 3 users, load average: 0.00, 0.01, 0.05 15:01:53 up 2 days, 6:02, 3 users, load average: 0.00, 0.01, 0.05 15:01:53 up 2 days, 6:02, 3 users, load average: 0.00, 0.01, 0.05 15:01:54 up 2 days, 6:02, 3 users, load average: 0.00, 0.01, 0.05 15:01:55 up 2 days, 6:02, 3 users, load average: 0.00, 0.01, 0.05 15:01:55 up 2 days, 6:02, 3 users, load average: 0.00, 0.01, 0.05
说明:
sleep 与 usleep
sleep 单位 秒 sleep 1 休息1秒
usleep 单位 微秒 usleep 1000000 休息1s
1微秒等于百万分之一秒(10的负6次方秒)
时间测试
[root@clsn while]# time sleep 0.1real 0m0.102suser 0m0.001ssys 0m0.000s
1.3.3 while 作用
补充定时任务功能,执行小于1秒的定时任务
循环执行某些操作,例如水果菜单
(1.3.6)
示例1:使用while循环实现水果菜单的重复使用
脚本内容
1 使用while循环实现水果菜单的重复使用
脚本执行过程
示例2:计算1-100的和
方法一 (bc命令实现)
echo `seq -s + 1 100`|bc
方法二(while循环方法)
[root@clsn while]# cat jishan.sh #!/bin/bash############################################################## File Name: jishan.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-09 15:18:44# Description:#############################################################i=1while [ "$i" -le 100 ] do ((b=b+i)) ((i++))doneecho $b
示例3:实现类似手机通讯计费功能
脚本内容:
1 [root@clsn scripts]# cat while/shouji.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: shouji.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-09 15:56:09 9 # Description:10 #############################################################11 sum=100012 i=1513 14 15 while [ $sum -ge 15 ]16 do17 cat<
1.4 获取取文件中的行,单词和字符
1.4.1 迭代获取文件中的每一行
方法一
while read line; do echo $line;done < file.txt
方法二
cat file.txt|while read line doecho $linedone
方法三
exec < file.txtwhile read line; do echo line;done
1.4.2 迭代获取每一个单词
for word in $line; do echo $word;done
1.4.3 迭代获取每一个字符
word=participatefor ((i=0;i<${#word};i++)) do echo ${word:1:1};done
1.4.4 同时获取取文件中的行,单词和字符脚本
脚本内容
#!/bin/bashn=1while read i do echo "第${n}行 $i" m=1 for x in $i do echo "第${m}个单词 $x" echo $x|grep -o . ((m++)) done ((n++))done < $1
脚本执行结果:
1 [root@clsn scripts]# sh lunxun.sh /etc/hosts 2 第1行 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 3 第1个单词 127.0.0.1 4 1 5 2 6 7 7 . 8 0 9 . 10 0 11 . 12 1 13 第2个单词 localhost 14 l 15 o 16 c 17 a 18 l 19 h 20 o 21 s 22 t 23 第3个单词 localhost.localdomain 24 l 25 o 26 c 27 a 28 l 29 h 30 o 31 s 32 t 33 . 34 l 35 o 36 c 37 a 38 l 39 d 40 o 41 m 42 a 43 i 44 n 45 第4个单词 localhost4 46 l 47 o 48 c 49 a 50 l 51 h 52 o 53 s 54 t 55 4 56 第5个单词 localhost4.localdomain4 57 l 58 o 59 c 60 a 61 l 62 h 63 o 64 s 65 t 66 4 67 . 68 l 69 o 70 c 71 a 72 l 73 d 74 o 75 m 76 a 77 i 78 n 79 4 80 第2行 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 81 第1个单词 ::1 82 : 83 : 84 1 85 第2个单词 localhost 86 l 87 o 88 c 89 a 90 l 91 h 92 o 93 s 94 t 95 第3个单词 localhost.localdomain 96 l 97 o 98 c 99 a100 l101 h102 o103 s104 t105 .106 l107 o108 c109 a110 l111 d112 o113 m114 a115 i116 n117 第4个单词 localhost6118 l119 o120 c121 a122 l123 h124 o125 s126 t127 6128 第5个单词 localhost6.localdomain6129 l130 o131 c132 a133 l134 h135 o136 s137 t138 6139 .140 l141 o142 c143 a144 l145 d146 o147 m148 a149 i150 n151 6152 第3行 10.0.0.1 mirrors.aliyuncs.com mirrors.aliyun.com153 第1个单词 10.0.0.1154 1155 0156 .157 0158 .159 0160 .161 1162 第2个单词 mirrors.aliyuncs.com163 m164 i165 r166 r167 o168 r169 s170 .171 a172 l173 i174 y175 u176 n177 c178 s179 .180 c181 o182 m183 第3个单词 mirrors.aliyun.com184 m185 i186 r187 r188 o189 r190 s191 .192 a193 l194 i195 y196 u197 n198 .199 c200 o201 m202 第4行 10.0.0.180 clsn203 第1个单词 10.0.0.180204 1205 0206 .207 0208 .209 0210 .211 1212 8213 0214 第2个单词 clsn215 c216 l217 s218 n
1.4.5 eval 命令用法
[root@clsn ~]# clsn=6[root@clsn ~]# echo {1..$clsn}{1..6}[root@clsn ~]# eval echo {1..$clsn}1 2 3 4 5 6
eval 命令的说明
[root@clsn ~]# help evaleval: eval [参数 ...] 将参数作为 shell 命令执行。 将 ARGs 合成一个字符串,用结果作为 shell 的输入, 并且执行得到的命令。 退出状态: 以命令的状态退出,或者在命令为空的情况下返回成功。
1.5 break continue exit return
条件与循环控制及程序返回值命令表
命令 | 说明 |
break n | 如果省略n,则表示跳出整个循环,n表示跳出循环的层数 |
continue n | 如果省略n,则表示跳过本次循环,忽略本次循环的剩余代码,进人循环的下一次循环。 n表示退到第n层继续循环 |
exit n | 退出当前Shell程序,n为上一次程序执行的状态返回值。n也可以省略,在下一个Shell里可通过"$?"接收exit n的n值 |
return n | 用于在函数里作为函数的返回值,以判断函数执行是否正确。在下一个Shell里可通过"$?"接收exit n的n值 |
简单来说即: break 跳出循环continue 跳出本次循环exit 退出脚本return 与 exit 相同,在函数中使用
1.5.1 break命令说明
[root@clsn scripts]# help break break: break [n] 退出 for、while、或 until 循环 退出一个 FOR、WHILE 或 UNTIL 循环。如果指定了N,则打破N重 循环 退出状态: 退出状态为0除非 N 不大于或等于 1。
测试脚本内容
1 #!/bin/bash 2 3 for i in {1..5} 4 5 do 6 7 if [ $i -eq 3 ] 8 9 then10 11 break12 13 fi14 15 echo $i16 17 done18 19 echo "ok"
脚本执行结果
[root@clsn scripts]# sh break.sh 1 2 ok
1.5.2 continue命令说明
[root@clsn scripts]# help continue continue: continue [n] 继续 for、while、或 until 循环。 继续当前 FOR、WHILE 或 UNTIL 循环的下一步。 如果指定了 N, 则继续当前的第 N 重循环。 退出状态: 退出状态为 0 除非 N 不大于或等于1。
测试脚本内容
1 #!/bin/bash 2 for i in {1..5} 3 do 4 if [ $i -eq 3 ] 5 then 6 continue 7 fi 8 echo $i 9 done10 echo "ok"
脚本执行结果
[root@clsn scripts]# sh continue.sh 1245ok
1.5.3 exit命令说明
[root@clsn scripts]# help exitexit: exit [n] 退出shell。 以状态 N 退出 shell。 如果 N 被省略,则退出状态 为最后一个执行的命令的退出状态。
测试脚本内容
1 #!/bin/bash 2 for i in {1..5} 3 do 4 if [ $i -eq 3 ] 5 then 6 exit 7 fi 8 echo $i 9 done10 echo "ok"
脚本执行结果
[root@clsn scripts]# sh exit.sh 1 2
1.5.4 return命令说明
[root@clsn tuichu]# help return return: return [n] 从一个 shell 函数返回。 使一个函数或者被引用的脚本以指定的返回值 N 退出。 如果 N 被省略,则返回状态就是 函数或脚本中的最后一个执行的命令的状态。 退出状态: 返回 N,或者如果 shell 不在执行一个函数或引用脚本时,失败。
1.6 shell中的数组
1.6.1 为什么会产生Shell数组
通常在开发Shell脚本时,定义变量采用的形式为“a=l;b=2;C=3”,可如果有多个 变量呢?这时再逐个地定义就会很费劲,并且要是有多个不确定的变量内容,也会难以 进行变量定义,此外,快速读取不同变量的值也是一件很痛苦的事情,于是数组就诞生 了,它就是为了解决上述问题而出现的。
1.6.2 什么是Shell数组
Shell的数组就是一个元素集合,它把有限个元素(变量或字符内容)用一个名字来 命名,然后用编号对它们进行区分。这个名字就称为数组名,用于区分不同内容的编 号就称为数组下标。组成数组的各个元素(变量)称为数组的元素,有时也称为下标变量。
1.6.3 数组中的增删改查
数组的定义
# 定义数组[root@clsn scripts]# stu=(001 002 003)# 打印数组[root@clsn scripts]# echo ${stu[@]}001 002 003# 显示数组长度[root@clsn scripts]# echo ${#stu}3
查: 遍历数组的内容
# 打印数组内容(通过数组下标或索引)[root@clsn scripts]# echo ${stu[0]}001[root@clsn scripts]# echo ${stu[1]}002[root@clsn scripts]# echo ${stu[2]}003[root@clsn scripts]# echo ${stu[3]}# 遍历数组 方法一[root@clsn scripts]# for i in ${stu[@]};do echo $i ;done 001002003 # 方法二[root@clsn scripts]# array=(1 2 3 4 5)[root@clsn scripts]# for i in `eval echo {1..${#array[@]}}`;do echo ${array[i-1]};done12345
增:数组添加
[root@clsn scripts]# stu[3]=004[root@clsn scripts]# echo ${stu[@]}001 002 003 004
改:数组修改
[root@clsn scripts]# stu[2]=000[root@clsn scripts]# echo ${stu[@]}001 002 000 004
删:数组删除
[root@clsn scripts]# unset stu[2][root@clsn scripts]# echo ${#stu[@]}3[root@clsn scripts]# echo ${stu[@]}001 002 004
1.6.4 将命令的结果赋值给数组
dir=(`ls`)dir=($(ls))
命令定义数组
[root@clsn scripts]# COM=(`ls`)[root@clsn scripts]# echo ${COM[@]}bianliang.sh case cfb.sh chanshu.sh check check_url.sh clsn.sh clsn_test.sh daojishi.sh ddos_check.sh echo.sh for for2 fruits.sh function fz.sh html jingdutiao.sh jishuanqi2.sh jishuanqi.sh lamp.sh lnmp.sh memcache_check.sh menu.sh nginx.sh panduan panduan1 play quanju.sh rsync_check.sh rsyncd system6 tuichu web_check.sh web_view.sh while xiugaizhuji.sh yhk.sh yunshuan.sh zhuajiu.sh
1.6.1 数组定义格式
[root@clsn scripts]# a=(1 2 3 )[root@clsn scripts]# b=(1> 2> 3> 4> )[root@clsn scripts]# echo ${a[@]}1 2 3[root@clsn scripts]# echo ${b[@]}1 2 3 4
1.6.2 数组的本质就是一个变量,只是这个变量存了多个值
在shell 常用的功能是查
array=(valuel value2 value3 ...)
打印数组格式
${array[@]} 所有元素${#array[@]} 数组长度${array[i]} 单个元素,i是下标
1.6.3 【练习题】批量检查多个网站地址是否正常
要求:
1、使用shell数组方法实现,检测策略尽量模拟用户访问。
2、每10秒钟做一次所有的检测,无法访问的输出报警。
3、待检测的地址如下
http://www.cnblogs.com/clsn/
http://blog.znix.top
http://blog.nmtui.com
http://10.0.0.7
脚本内容:
1 [root@clsn scripts]# cat check_url.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: check_url.sh 5 # Version: V1.3 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-12 10:44:39 9 # Description:10 #############################################################11 url=(12 http://www.cnblogs.com/clsn/13 http://blog.znix.top14 http://blog.nmtui.com15 http://10.0.0.716 )17 while true 18 do19 for i in ${url[@]} 20 do 21 #curl $i &>/dev/null22 a=$(curl -I -w "%{http_code}\n" -o /dev/null -s $i)23 if [ $a -ne 200 ]24 then25 echo "$url 异常"26 fi27 done28 sleep 1029 done
1.7 Shell 函数
shell一个非常重要的特性是它可作为一种编程语言来使用。因为shell是一个解释器,所以它不能对为它编写的程序进行编译,而是在每次从磁盘加载这些程序时对它们进行解释。而程序的加载和解释都是非常耗时的。
针对此问题,许多shell(如BourneAgainShell)都包含shell函数,shell把这些函数放在内存中,这样每次需要执行它们时就不必再从磁盘读入。shell还以一种内部格式来存放这些函数,这样就不必耗费大量的时间来解释它们。
函数的作用就是把程序里多次调用相同代码的部分定义成一份,然后起个名字,所有的调用都 只用这名字就可以了,修改代码时,只需要改变函数体内的代码即可。
1.7.1 使用函数的优势
? 把相同的程序段定义成函数,可以减少代码量。
? 增加程序的可读、易读性
? 实现程序功能的模块化
1.7.2 定义函数
function clsn(){ echo "http://blog.znix.top"}znix(){ echo "http://www.znix.top " }
说明:
1、可以带function clsn() 定义,也可以直接clsn() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
3、执行函数就是将函数名放到定义的函数之后即可
将函数加载到当前窗口执行:
[root@clsn function]# . fun1.sh [root@clsn function]# znznew znix [root@clsn function]# znix test[root@clsn function]# clsn http://blog.znix.top
1.7.3 引用函数
脚本内容
[root@clsn function]# cat fun2.sh #!/bin/bash############################################################## File Name: fun2.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-11 19:25:56# Description:#############################################################Fun_File=/server/scripts/function/fun1.sh[ -f $Fun_File ] && . $Fun_Fileclsn
脚本执行结果
[root@clsn function]# sh fun2.shhttp://blog.znix.top
1.7.4 函数传参
脚本内容:
[root@clsn function]# cat fun3.sh #!/bin/bash############################################################## File Name: fun3.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-12 09:38:48# Description:#############################################################function clsn(){ echo "Hi "}CLSN(){ echo "Hello " echo $0 echo $1 echo $2}clsnCLSN xi xi
脚本执行结果
[root@clsn function]# sh fun3.sh Hi Hello fun3.shxixi
1.7.5 $0 永远的脚本名称
function clsn(){ echo "http://blog.znix.top $1 $2" echo $0}znix(){ echo "test" }clsn $1 $2
执行结果
[root@clsn function]# sh fun1.sh http://blog.znix.top fun1.sh
1.7.6 函数中return的用法
脚本内容:
[root@clsn function]# cat fun3.sh #!/bin/bash############################################################## File Name: fun3.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-12 09:38:48# Description:#############################################################function clsn(){ echo "Hi "}CLSN(){ echo "Hello " echo $0 echo $1 echo $2 return 4 echo "xxixiixxiix"}clsnCLSN xi xi echo $?
脚本执行结果
[root@clsn function]# sh fun3.shHi Hello fun3.shxixi4
return命令说明:
[root@clsn function]# help return return: return [n] 从一个 shell 函数返回。 使一个函数或者被引用的脚本以指定的返回值 N 退出。 如果 N 被省略,则返回状态就是 函数或脚本中的最后一个执行的命令的状态。 退出状态: 返回 N,或者如果 shell 不在执行一个函数或引用脚本时,失败。
1.7.7 自定义常用函数库
1 #!/bin/bash 2 ############################################################# 3 # File Name: /server/scripts/userfun.sh 4 # Version: V1.0 5 # Author: clsn 6 # Organization: http://blog.znix.top 7 # Created Time : 2017-12-12 10:40:04 8 # Description: 9 #############################################################10 11 # 脚本初始化12 function scripts_init(){13 prog=`basename $0 .sh`14 LockFile=/var/lock/subsys/${prog}.lock # 使用锁文件15 LogFile=/var/log/${prog}.log # 脚本记录日志16 PidFile=/var/run/${prog}.pid # 记录进程号,可以管理脚本17 18 [ -f $LockFile ] && echo "There $LockFile is exist!!" && exit 1 ||touch $LockFile19 [ ! -f $LogFile ] && touch $LogFile20 [ -f $PidFile ] && echo "There $PidFile is exist!!" && exit 2|| echo $$ > $PidFile21 }22 23 # 记录日志24 function writelog(){25 Date=$(date "+%F_%T")26 ShellName=`basename $0`27 Info=$128 echo "$Date : ${ShellName} : ${Info}" >> ${LogFile}29 }30 31 # 脚本退出扫尾32 function closeout(){33 [ -f $LockFile ] && rm -f $LockFile 34 [ -f $PidFile ]&& rm -f $PidFile35 }36 37 # 判断输入是整数38 function int_judge(){39 fun_a=$140 expr $fun_a + 1 &>/dev/null41 RETVAL=$?42 return $RETVAL43 }44 45 # 判断输入非空46 function input_judge(){47 RETVAL=048 fun_a=$149 [ ${#fun_a} -eq 0 ]&& RETVAL=150 return $RETVAL51 }
basename命令
取出文件名称
[root@clsn function]# basename /server/scripts/zhuajiu.sh zhuajiu.sh[root@clsn function]# basename /server/scripts/zhuajiu.sh .sh zhuajiu
$$ 参数
取出脚本运行时的pid, 脚本运行的当前进程ID号
[root@clsn function]# echo $$37208[root@clsn function]# ps -ef |grep 37208root 37208 37206 0 08:39 pts/0 00:00:00 -bashroot 38578 37208 1 10:33 pts/0 00:00:00 ps -efroot 38579 37208 0 10:33 pts/0 00:00:00 grep --color=auto 37208
引用自定义函数库示例:
[root@clsn function]# head -22 fun3.sh #!/bin/bash############################################################## File Name: fun3.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-12 09:38:48# Description:#############################################################. /server/scripts/userfun.shscripts_init i=1while ((i<=10)) do uptime ((i++)) sleep 1donecloseout
1.8 shell脚本的调试
1.8.1 脚本调试技巧
调试技巧1:使用dos2unix处理脚本
从windows编辑的脚本到Linux下需要使用这个命令dos2unix windows.sh
调试技巧2:使用echo命令调试
在变量读取或修改的前后加入echo $变量,也可在后面使用exit退出脚本,这样可以不用注释后面的代码
调试技巧3:sh -x 脚本 ==》全局调试
sh -x scripts.sh
调试技巧4:局部调试
set -x要调试的脚本内容set +x
1.8.2 Shell调试技巧小结
①要记得首先用dos2unix对脚本格式化。
②直接执行脚本根据报错来调试,有时报错不准确。
③sh -x调试整个脚本,显示执行过程。
④set -x和set +x调试部分脚本(在脚本中设置)
⑤echo输出变量及相关内容,然后紧跟着exit退出,不执行后面程序的方式,一步步跟踪脚本,对于逻辑错误比较好用。
写法: echo $var;exit
⑥最关键的是语法熟练、编码习惯、编程思想,将错误扼杀在萌芽之中,减轻调试负担,提高效率。
1.9 shell编程练习题
1.9.1 【练习题1】shell实现抓阄程序
需要使用shell编写一个抓阄的程序:
要求:
1、执行脚本后,输入英文名字全拼,产生随机数01-99之间的数字,数字越大评分就去高,前面已经抓到的数字,下次不能在出现相同数字。
2、第一个输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出继续等待别人输入。
脚本内容:
1 [root@clsn scripts]# cat zhuajiu.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: zhuajiu.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-10 15:21:27 9 # Description:10 #############################################################11 Randow_Temp=/tmp/randow.test12 name_Out_File1=/tmp/name_Out_File1.test13 name_Out_File2=/tmp/name_Out_File2.test14 15 >$name_Out_File116 >$name_Out_File217 >$Randow_Temp18 19 trap 'echo "请勿使用 Ctrl+c"' 220 21 Randow() {22 sum=`echo $RANDOM |cut -c-2`23 grep $sum $Randow_Temp24 if [ $? -eq 0 ];then25 Randow26 else27 echo $sum >>$Randow_Temp28 daxiao=$sum29 fi30 }31 32 Print() {33 read -p "请输入名字的拼音:" Name 34 Randow35 echo $Name $daxiao >>$name_Out_File36 }37 38 while true39 do40 clear41 echo ""42 echo -e "\033[32m 这个程序会将随机数字排名前三的同学显示出来!\033[0m"43 echo -e "\033[31m 退出脚本请使用 'exit' \033[0m" 44 echo ""45 head -4 $name_Out_File246 read -p "请输入名字的拼音:" "Name"47 if [ "$Name" == exit ]48 then 49 exit50 fi51 Randow52 echo $daxiao $Name >>$name_Out_File153 echo "随机数最大的三位同学是:" >$name_Out_File254 sort -k1 -r $name_Out_File1 |column -t >>$name_Out_File255 clear56 done
脚本执行过程
1.9.2 【练习题2】输出9x9 乘法表
脚本内容:
1 [root@clsn scripts]# cat cfb.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: cfb.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-11 15:40:03 9 # Description:10 #############################################################11 for a in `seq 1 9`12 do13 for b in `seq 1 9`14 do15 if [ $a -ge $b ]16 then17 echo -en "$a x $b = $(expr $a \* $b) "18 19 fi20 done21 echo " "22 done
执行结果
[root@clsn scripts]# sh cfb.sh 1 x 1 = 1 2 x 1 = 2 2 x 2 = 4 3 x 1 = 3 3 x 2 = 6 3 x 3 = 9 4 x 1 = 4 4 x 2 = 8 4 x 3 = 12 4 x 4 = 16 5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 6 x 1 = 6 6 x 2 = 12 6 x 3 = 18 6 x 4 = 24 6 x 5 = 30 6 x 6 = 36 7 x 1 = 7 7 x 2 = 14 7 x 3 = 21 7 x 4 = 28 7 x 5 = 35 7 x 6 = 42 7 x 7 = 49 8 x 1 = 8 8 x 2 = 16 8 x 3 = 24 8 x 4 = 32 8 x 5 = 40 8 x 6 = 48 8 x 7 = 56 8 x 8 = 64 9 x 1 = 9 9 x 2 = 18 9 x 3 = 27 9 x 4 = 36 9 x 5 = 45 9 x 6 = 54 9 x 7 = 63 9 x 8 = 72 9 x 9 = 81
1.9.3 【练习题3】解决dDOS攻击生产案例
写一个Shell脚本解决DOS攻击生产案例。
请根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100(读者根据实际情况设定),即调用防火墙命令封掉对应的IP。防火墙命令为:iptables-I INPUT -s IP地址 -j DROP。
练习使用日志下载地址:https://files.cnblogs.com/files/clsn/access-web-log.zip
脚本内容:
1 [root@clsn while]# cat ddos_check.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: ddos_check.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-10 12:34:15 9 # Description:10 #############################################################11 12 Info_File=/tmp/ddos_check.log13 14 #从连接数获取15 #netstat -lant|awk -F "[ :]+" '/180:80/{clsn[$6]++}END{for(pol in clsn)print pol,clsn[pol]}' >$Info_File16 17 # 从日志获取18 awk '{hotel[$1]++}END{for(pol in hotel)print pol,hotel[pol]}' access.log|sort -nk2 -r >$Info_File19 20 while read line 21 do 22 Ip_Add=`echo $line |awk '{print $1}'`23 Access=`echo $line |awk '{print $2}'`24 if [ $Access -ge 10000 ]25 then26 #echo $Ip_Add27 iptables -I INPUT -s $Ip_Add -j DROP28 fi29 done <$Info_File
脚本执行结果:
[root@clsn while]# iptables -LChain INPUT (policy ACCEPT)target prot opt source destination DROP all -- 112.64.171.98 anywhere DROP all -- 58.220.223.62 anywhere Chain FORWARD (policy ACCEPT)target prot opt source destination Chain OUTPUT (policy ACCEPT)target prot opt source destination
其他方法进行日志分析
elk日志分析
http://blog.oldboyedu.com/elk/
nginx-WAF
http://blog.oldboyedu.com/nginx-waf/
1.9.4 【练习题4】开发脚本入侵检测与报警案例(入侵检测系统)
监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次。
IDS是英文“Intrusion Detection Systems”的缩写,中文意思是“入侵检测系统”。
脚本内容
第一个里程碑:生成md5验证文件
文件的校验文件
find /var/html/www/* -type f |xargs md5sum >/tmp/check/web_file_check.md5sum
目录的校验文件
tree /var/html/www/ -d >/tmp/check/web_dir_check.txtmd5sum /tmp/check/web_dir_check.txtmd5sum /tmp/check/web_dir_check.txt >/tmp/check/web_dir_check.md5sum
脚本内容
1 [root@clsn check]# cat web_file_check.sh 2 #!/bin/bash 3 ############################################################# 4 # File Name: web_file_check.sh 5 # Version: V1.0 6 # Author: clsn 7 # Organization: http://blog.znix.top 8 # Created Time : 2017-12-10 14:15:34 9 # Description:10 #############################################################11 12 Url1=http://10.0.0.1/web_file_check.md5sum13 Url2=http://10.0.0.1/web_dir_check.md5sum14 Dir=/tmp/check/15 Web_Dir=/var/html/www/16 Check_File1=/tmp/check/web_file_check.md5sum17 Check_File2=/tmp/check/web_dir_check.md5sum18 Check_Dir=/tmp/check/web_dir_check.txt19 Check_Out=/tmp/check/check_out.md5sum20 Mail_info=/tmp/check/mail.txt21 Date=`date +%F_%T`22 Host_Name=`hostname`23 Host_IP=`hostname -I`24 Email_Addr=995701749@qq.com25 26 [ -d $Dir ] || mkdir -p $Dir27 if [ ! -f $Check_File1 ] 28 then 29 cd $Dir &&\30 wget $Url131 elif [ ! -f $Check_File2 ]32 then 33 cd $Dir &&\34 wget $Url235 fi36 37 md5sum -c $Check_File1 >$Check_Out 2>/dev/null38 Back_num1=$?39 tree -d $Web_Dir >$Check_Dir40 md5sum -c $Check_File2 &>/dev/null41 Back_num2=$?42 if [ $Back_num1 -ne 0 ]43 then44 echo "发生主机:$Host_Name 主机IP地址:$Host_IP" > $Mail_info45 echo "在 $Date 的检测中发现以下文件被篡改" >>$Mail_info46 echo "==================================================" >>$Mail_info 47 egrep -i "失败|failed" $Check_Out >>$Mail_info48 echo "==================================================" >>$Mail_info 49 echo "请尽快登陆服务器进行处理!!!" >>$Mail_info50 mail -s "【警告】web站点文件被篡改" -a $Check_File1 $Email_Addr <$Mail_info51 fi52 53 if [ $Back_num2 -ne 0 ]54 then55 echo "目录检测信息" >$Mail_info56 echo "在 $Date 的检测中发现目录被篡改" >>$Mail_info57 mail -s "【警告】web站点目录被篡改" -a $Check_Dir $Email_Addr<$Check_Dir58 fi
修改文件目录后执行结果
1.9.5 【练习题5】单词及字母去重排序案例
用shell处理以下内容
1、按单词出现频率降序排序!
2、按字母出现频率降序排序!
the squid project provides a number ofresources to assist users design implement and support squid installations.Please browse the documentation and support sections for more infomation byoldboy training
脚本内容:
[root@clsn play]# cat abc.sh #!/bin/bash############################################################## File Name: abc.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-11 17:23:19# Description:#############################################################a="the squid project provides a number ofresources to assist users design implement and support squid installations.Please browse the documentation and support sections for more infomation byoldboy training"echo "按单词出现频率降序排序!"for i in $a do echo $i done|\ sort |uniq -c|sort -nk1 -recho "按字母出现频率降序排序!"echo $a |grep -o "[a-z]" |sort|uniq -c |sort -nk1 -r
1.9.6 【练习题6】编写正(或长)方形图形案例
请用shell或Python编写一个正(或长)方形,接收用户输入的数字。
shell脚本内容
[root@clsn play]# cat zhengfangxing.sh#!/bin/bash############################################################## File Name: zhengfangxing.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-11 17:33:33# Description:#############################################################trap "echo 输入exit退出" 2while true do read -p "你想看多大的正方形:" a [ "$a" == "exit" ] && exit expr 1 + $a &>/dev/null [ $? -ne 0 ] && echo "请输入一个数字!" && exit 2 b="■ " d=$(for i in `eval echo {1..$a}`;do echo -n $b; echo -n " ";done) for i in `eval echo {1..$a}` do echo "$d" donedone
脚本执行效果
[root@clsn play]# sh zhengfangxing.sh 4■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ [root@clsn play]# sh zhengfangxing.sh 3■ ■ ■ ■ ■ ■ ■ ■ ■
1.10 各种语句小结
? while循环的特长是执行守护进程以及我们希望循环不退出持续执行,用于频率小于1分钟循环处理(crond),其他的while循环几乎都可以被for循环替代。
? case语句可以被if语句替换,一般在系统启动脚本传入少量固定规则字符串用case语句,其他普通判断多用if。
? 一句话,if,for语句最常用,其次while(守护进程),case(服务启动脚本)。
1.11 附录
1.11.1 格式化文本--对齐文本
[root@clsn scripts]# column --help 用法: column [选项] [文件 ...]选项: -c, --columns <宽度> 输出宽度(字符数) -t, --table 创建表格 -s, --separator <字符串> 可用的表格分隔符 -o, --output-separator <字符串> 表格输出列分隔符,默认为两个空格 -x, --fillrows 先填充行,再填充列 -h, --help 显示此帮助并退出 -V, --version 输出版本信息并退出更多信息请参阅 column(1)。 字符串> 字符串> 宽度>
1.11.2 服务器被挂马怎么办?
- 将被挂马服务器上,原有重要数据备份下来
- 仔细筛查数据,确保其中都是正常文件
- 重新安装服务器操作系统,并针对性的加强安全防护。
- 切记,服务器中木马后必须重新安装操作系统。
1.11.3 怎么通过进程找到程序
通过进程找到pid号码
[root@clsn proc]# ps -ef |grep sshd root 1294 1 0 09:18 ? 00:00:00 /usr/sbin/sshd -D
通过pid找到在proc目录下的临时文件夹
[root@clsn proc]# cd /proc/1294[root@clsn 1294]#
查看其中的exe文件,即可发现程序文件的路径
[root@clsn 1294]# ll exe lrwxrwxrwx 1 root root 0 12月 11 09:18 exe -> /usr/sbin/sshd
1.11.4 screen程序 防止脚本执行中断
用操作,更多详情参照
ctrl +a +d 退出当前终端,返回加载screen前的shell命令状态screen -ls 可看screen会话screen -r id 指定进入哪个screen会话
screen进程原理
[root@clsn ~]# ps -ef |grep ping root 30170 30153 0 11:57 pts/5 00:00:00 ping 10.0.0.254root 30172 30078 0 11:58 pts/0 00:00:00 grep --color=auto ping[root@clsn ~]# ps -ef |grep 30170root 30170 30153 0 11:57 pts/5 00:00:00 ping 10.0.0.254root 30174 30078 0 11:59 pts/0 00:00:00 grep --color=auto 30170[root@clsn ~]# ps -ef |grep 30153root 30153 30119 0 11:57 pts/5 00:00:00 /bin/bashroot 30170 30153 0 11:57 pts/5 00:00:00 ping 10.0.0.254root 30176 30078 0 11:59 pts/0 00:00:00 grep --color=auto 30153[root@clsn ~]# ps -ef |grep 30119root 30119 1 0 11:56 ? 00:00:00 SCREENroot 30120 30119 0 11:56 pts/4 00:00:00 /bin/bashroot 30153 30119 0 11:57 pts/5 00:00:00 /bin/bashroot 30178 30078 0 11:59 pts/0 00:00:00 grep --color=auto 30119
1.11.5 shell中实现倒计时效果
脚本内容
[root@clsn scripts]# cat daojishi.sh #!/bin/bash############################################################## File Name: daojishi.sh# Version: V1.0# Author: clsn# Organization: http://blog.znix.top# Created Time : 2017-12-12 08:49:11# Description:#############################################################for i in `seq -w 10 -1 1` do echo -ne "\b\b$i"; sleep 1;done
脚本执行效果
1.12 linux中的信号
1.12.1 Linux系统的重要信号及说明
信号 | 说明 |
HUP(l) | 挂起,通常因终端掉线或用户退出而引发 |
INT(2) | 中断,通常因按下Ctrl+c组合键而引发 |
QUIT(3) | 退出,通常因按下Ctrl+\组合键而引发 |
ABRT(6) | 中止,通常因某些严重的执行错误而引发 |
ALRM(14) | 报警,通常用来处理超时 |
TERM(15) | 终止,通常在系统关机时发送 |
TSTP(20) | 停止进程的运行,但该信号可以被处理和忽略,通常因按下Ctrl+z组合键而引发 |
使用trap控制信号通常需要忽略的信号包括HUP、INT、QUIT、TSTP、TERM等,对应的信号编号分别为1、2、3、20、15。Shell脚本中既可以用数字来代表信号,也可以使用信号的名字来代表信号
1.12.2使用trap控制信号
trap命令用于指定在接收到信号后将要采取的行动,信号的相关说明前面已经提到 过。trap命令的一种常见用途是在脚本程序被中断时完成清理工作,或者屏蔽用户非法 使用的某些信号。在使用信号名时需要省略SIG前缀。可以在命令提示符下输人命令 trap -1来查看信号的编号及其关联的名称。
trap命令的参数分为两部分,前一部分是接收到指定信号时将要采取的行动,后一部分是要处理的信号名。
trap命令的使用语法如下:
trap command signal
signal是指接收到的信号,command是指接收到该信号应采取的行动。也就是:
trap ‘命令;命令’ 信号编号或trap ‘命令;命令’ 信号名
[root@clsn ~]# trap 'echo clsn' 2 [root@clsn ~]# ^Cclsn
1.13 参考文档
http://blog.csdn.net/zhangna20151015/article/details/50293987https://zh.wikipedia.org/wiki/For迴圈#傳統的_for_迴圈_for-loops https://zh.wikipedia.org/wiki/While迴圈https://www.cnblogs.com/kerrycode/p/6537175.html (生产随机数)http://blog.51cto.com/lidao/1936495 (不循环,批量创建用户)http://www.runoob.com/linux/linux-shell-func.html 函数