?
?
?
?
一shell脚本for循环语句
?
?
(一)for循环语句介绍
?
循环执行:将某代码段重复运行多次,重复运行多少次。也就是循环次数事先已知或者循环次数事先未知,有进入条件和退出条件。
循环语句有for,while,until
?
?
?
查看帮助文档,有两种语法
因为NAME是变量名,不加$
[[email?protected] ~]# type for
for is a shell keyword [[email?protected] ~]# help for for: for NAME变量名 [in WORDS ... ] ; do COMMANDS; done
0420变量值就是列表中的某个值。有几个单词就会执行几遍
Execute commands for each member in a list. The `for‘ loop executes a sequence of commands for each member in a list of items. If `in WORDS ...;‘ is not present,then `in "[email?protected]"‘ is assumed. For each element in WORDS,NAME is set to that element,and the COMMANDS are executed. Exit Status: Returns the status of the last command executed. for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done Arithmetic for loop. Equivalent to (( EXP1 )) while (( EXP2 )); do COMMANDS (( EXP3 )) done EXP1,EXP2,and EXP3 are arithmetic expressions. If any expression is omitted,it behaves as if it evaluates to 1. Exit Status: Returns the status of the last command executed.
?
?
?
?
?
?
对比case,如果name是变量名,要加$
[[email?protected] ~]# help case
case: case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac Execute commands based on pattern matching. Selectively execute COMMANDS based upon WORD matching PATTERN. The `|‘ is used to separate multiple patterns. Exit Status: Returns the status of the last command executed.
?
?
?
?
?
?
?
(1)第1种语法——变量取值型
?
for 变量名 in 列表;do
循环体
done
?
执行机制:依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束。
?
在此结构中"in变量取值列表”可以省略,省略时相当于in "
[email?protected]"
也就是使用for i就相当于使用for i in "
[email?protected]"
在这种for循环语句语法中,for关键字后面会有一个“变量名”,
变量名依次获取in关键字后面的变量取值列表内容(以空格分隔),
每次仅取一个,然后进入循环(do和done之间的部分)
执行循环内的所有指令,当执行到done时结束本次循环。
之后,“变量名”再继续获取变量列表里的下一个变量值,继续执行循环内的所有指令,
当执行到done时结束返回,以此类推,直到取完变量列表里的最后一个值并进入循环执行到done结束为止。
?
?
?
?
?
?
for循环执行流程图
?
?
?

?
?
?
?
?
?
?
?
?
(2)第2种语法——C语言for循环语句
?
?
第二种for循环语句称为C语言型for循环语句,其语法结构如下:
?
for ( (exp1; exp2; exp3))
do
指令...
done
?
?
for关键字后的双括号内是三个表达式,第一个是变量初始化(例如: i=0),
?
第二个为变量的范围(例如: i<100 ),第三个为变量自增或自减(例如: i++)。
?
当第一个表达式的初始化值符合第二个变量的范围时,就进入循环执行;当条件不满足时就退出循环。
?
?
?
?
?
?
(二)列表生成方式
?
?
?
(1)直接给出列表元素
[[email?protected] shell_scripts]# vim for.sh [[email?protected] shell_scripts]# bash for.sh num is 1 num is 2 num is 3 num is 4 [[email?protected] shell_scripts]# cat for.sh #!/bin/bash #Author:wang for num in 1 2 3 4 #写完4个数就会执行4次循环 do echo "num is $num" done
?
?
?
?
?
?
?
(2)整数列表
?
?{start..end},{start..end..step}
?
利用大括号{ }生成数字序列
[[email?protected] shell_scripts]# vim for1.sh [[email?protected] shell_scripts]# bash for1.sh num is 1 num is 2 num is 3 num is 4 [[email?protected] shell_scripts]# cat for1.sh #!/bin/bash #Author:wang for num in {1..4} #写完4个数就会执行4次循环 do echo "num is $num" done
?
?
?
?
?
[[email?protected] shell_scripts]# cat for1.sh #!/bin/bash #Author:wang for num in {a..g} do echo "num is $num" done [[email?protected] shell_scripts]# bash for1.sh num is a num is b num is c num is d num is e num is f num is g
?
?
?
?
?
?
{start..end..step}
[[email?protected] shell_scripts]# cat for1.sh #!/bin/bash #Author:wang for num in {10..2..1}从10到2递减,步长是1 do echo "num is $num" done [[email?protected] shell_scripts]# vim for1.sh [[email?protected] shell_scripts]# bash for1.sh num is 10 num is 9 num is 8 num is 7 num is 6 num is 5 num is 4 num is 3 num is 2
?
?
?
?
?
?
?
(3)使用seq生成数字序列
?
$(seq [start [step]] end)
[[email?protected] shell_scripts]# bash for_seq.sh
1 3 5 7 9 11 13 15 17 [[email?protected] shell_scripts]# cat for_seq.sh #!/bin/bash #Author=wang for i in `seq 1 2 18` do echo $i done [[email?protected] shell_scripts]#
?
?
?
?
?
?
?
注意如果是倒序,那么步长前面要加上-
[[email?protected] shell_scripts]# bash for_seq_1.sh
10 8 6 4 2 0 [[email?protected] shell_scripts]# cat for_seq_1.sh #!/bin/bash #Author=wang for i in `seq 10 -2 0` do echo $i done
?
?
?
?
?
?
[[email?protected] shell_scripts]# seq 1 5 66 1 6 11 16 21 26 31 36 41 46 51 56 61 66
?
?
?
?
?
?
?
注意如果是倒序显示步长要加负号
[[email?protected] shell_scripts]# seq 66 5 1 [[email?protected] shell_scripts]# seq 66 -5 1 66 61 56 51 46 41 36 31 26 21 16 11 6 1
?
?
?
?
?
?
[[email?protected] shell_scripts]#
bash for_3sum.sh
3367 [[email?protected] shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in `seq 1 100`;do if [ $[i%3] -ne 0 ]; then let sum+=i fi done echo $sum [[email?protected] shell_scripts]# vim for_3sum.sh [[email?protected] shell_scripts]# bash for_3sum.sh 3367 [[email?protected] shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in `seq 1 100`;do if [ "$[i%3]" -ne 0 ]; then let sum+=i fi done echo $sum
?
?
?
?
?
?
?
?
(4)返回列表的命令$(COMMAND)
?
注意要加上反引号
[[email?protected] shell_scripts]# cat for_command.sh #!/bin/bash #Author=wang for i in `ls /etc`;do echo $i done
?
?
?
?
?
?
[[email?protected] shell_scripts]# bash for_command.sh | wc 188 188 1803 [[email?protected] shell_scripts]# bash for_command.sh | head adjtime aliases aliases.db alternatives anacrontab asound.conf at.deny audisp audit bash_completion.d [[email?protected] shell_scripts]# bash for_command.sh | tail vmware-tools vsftpd wpa_supplicant X11 xdg xinetd.d yum yum.conf yum.repos_bak yum.repos.d
?
?
?
?
?
?
[[email?protected] shell_scripts]# bash command1.sh filename is /root/shell_scripts/1.sh filename is /root/shell_scripts/2.sh filename is /root/shell_scripts/backup1.sh filename is /root/shell_scripts/backup.sh filename is /root/shell_scripts/case1.sh filename is /root/shell_scripts/case.sh filename is /root/shell_scripts/command1.sh filename is /root/shell_scripts/for1.sh filename is /root/shell_scripts/for_3sum.sh filename is /root/shell_scripts/for.sh filename is /root/shell_scripts/for_sum.sh [[email?protected] shell_scripts]# cat command1.sh #!/bin/bash #Author:wang for filename in `ls /root/shell_scripts/*.sh`;do echo filename is $filename done
?
?
?
?
[[email?protected] shell_scripts]# bash command1.sh filename is /root filename is /root/shell_scripts/1.sh filename is /root/shell_scripts/2.sh filename is /root/shell_scripts/backup1.sh filename is /root/shell_scripts/backup.sh filename is /root/shell_scripts/case1.sh filename is /root/shell_scripts/case.sh filename is /root/shell_scripts/command1.sh filename is /root/shell_scripts/for1.sh filename is /root/shell_scripts/for_3sum.sh filename is /root/shell_scripts/for.sh filename is /root/shell_scripts/for_sum.sh [[email?protected] shell_scripts]# cat command1.sh #!/bin/bash #Author:wang for filename in ~ /root/shell_scripts/*.sh;do echo filename is $filename done
?
?
?
?
?
?
?
?
(5)使用使用通配符glob生成列表,如:*.sh
?
[[email?protected] shell_scripts]# bash command1.sh filename is /root filename is /root/shell_scripts/1.sh filename is /root/shell_scripts/2.sh filename is /root/shell_scripts/backup1.sh filename is /root/shell_scripts/backup.sh filename is /root/shell_scripts/case1.sh filename is /root/shell_scripts/case.sh filename is /root/shell_scripts/command1.sh filename is /root/shell_scripts/for1.sh filename is /root/shell_scripts/for_3sum.sh filename is /root/shell_scripts/for.sh filename is /root/shell_scripts/for_sum.sh [[email?protected] shell_scripts]# cat command1.sh #!/bin/bash #Author:wang for filename in ~ /root/shell_scripts/*.sh;do echo filename is $filename done
?
?
?
?
[[email?protected] shell_scripts]# bash command1.sh filename is /root/shell_scripts/1.sh filename is /root/shell_scripts/2.sh filename is /root/shell_scripts/backup1.sh filename is /root/shell_scripts/backup.sh filename is /root/shell_scripts/case1.sh filename is /root/shell_scripts/case.sh filename is /root/shell_scripts/command1.sh filename is /root/shell_scripts/for1.sh filename is /root/shell_scripts/for_3sum.sh filename is /root/shell_scripts/for.sh filename is /root/shell_scripts/for_sum.sh [[email?protected] shell_scripts]# cat command1.sh #!/bin/bash #Author:wang for filename in `ls /root/shell_scripts/*.sh`;do echo filename is $filename done
?
?
?
?
[[email?protected] shell_scripts]# cat for_*sh.sh #!/bin/bash #Author=wang for i in "*.sh";do echo this is $i done
?
?
?
?
[[email?protected] shell_scripts]# bash for_*sh.sh this is 100sum_100.sh 19_1.1.sh 19_1.sh 19_2.sh 1.sh 2.sh 33.sh 34.sh 5.sh argsnum1.sh argsnum.sh array.sh a.sh backup.sh break.sh case_1.sh case1.sh case.sh checkdisk.sh checkint.sh color_black.sh color_brown.sh color_green.sh color_rad.sh color.sh color_yellow.sh command1.sh continue.sh copy_cmd.sh crack_passwords.sh create_user1.sh createuser_1.sh createuser2.sh create_user.sh createuser.sh dadengyao.sh dengyao.sh diskcheck.sh equicrural_triangle.sh excute.sh factorial.sh file_KS.sh filetype.sh for1.sh for_3sum.sh for_command.sh for_seq_1.sh for_seq.sh for.sh for_*sh.sh for_sum.sh func1.sh func2.sh func3.sh gecos.sh guess_digit_endlessloop1.sh guess_digit_endlessloop.sh guess_digit.sh host_online.sh isoscelestriangle_2.sh isoscelestriangle.sh killcrackers.sh killcrackers_while.sh login.sh log.sh matrix.sh monitor_connections1.sh monitor_connections.sh nine_nine_multiplication_table.sh nine*nine_multiplication_table.sh nologin.sh randhtml_sedway.sh randhtml.sh randhtml_trmethod.sh rand_max_min1.sh rand_max_min.sh random_for.sh random_while.sh rectangle.sh scan_ip1.sh scan_ip_for.sh scan_ip.sh scan_ip_while.sh score.sh select_quit1.sh select_quit.sh sum_100_1.sh sum_100.sh sum.sh trap_9signal.sh trap.sh triangle1.sh triangle.sh triangle_tree.sh use_exp.sh user_passwd.sh while_read_users.sh yesorno_case.sh yesorno_if.sh yesorno.sh
?
?
?
?
?
?
?
?
(6)变量引用:[email?protected],$*
?
[[email?protected] shell_scripts]# cat for2.sh #!/bin/bash #Author=wang for i in `ls [email?protected]`;do echo $i done
?
?
?
[[email?protected] shell_scripts]# bash for2.sh | wc 117 118 1589 [[email?protected] shell_scripts]# bash for2.sh | head 100sum_100.sh 19_1.1.sh 19_1.sh 19_2.sh 1.sh 2.sh 33.sh 34.sh 5.sh argsnum1.sh [[email?protected] shell_scripts]# bash for2.sh | tail trap.sh triangle1.sh triangle.sh triangle_tree.sh use_exp.sh user_passwd.sh while_read_users.sh yesorno_case.sh yesorno_if.sh yesorno.sh
?
?
?
?
?
?
?
?
?
二for循环示例
?
(一)求和1-100的偶数
?
?
完整脚本
[[email?protected] shell_scripts]# cat for_sum.sh #!/bin/bash #Author:wang sum=0 for i in {2..100..2} do let sum+=i done echo $sum
?
?
?
?
?
执行结果
[[email?protected] shell_scripts]# bash for_sum.sh
2550
?
?
?
?
脚本解析
sum=0 对变量进行定义,初始值为0
let sum+=i 表示变量进行自增,相当于sum=sum+i
?
?
?
?
?
?下面是更容易理解的写法
[[email?protected] shell_scripts]# cat for_sum.sh #!/bin/bash #Author:wang sum=0 for i in {2..100..2} do let sum=sum+i done echo $sum [[email?protected] shell_scripts]# bash for_sum.sh 2550
?
?
?
?
?
?因为是一个整体,要使用中括号
[[email?protected] shell_scripts]# bash for_sum.sh
2550 [[email?protected] shell_scripts]# cat for_sum.sh #!/bin/bash #Author:wang sum=0 for i in {2..100..2} do let sum=$[sum+i] done echo $sum
?
?
?
?
?
?表示使用双括号括起来
[[email?protected] shell_scripts]# cat for_sum.sh #!/bin/bash #Author:wang sum=0 for i in {2..100..2} do let sum=$((sum+i)) done echo $sum [[email?protected] shell_scripts]# bash for_sum.sh 2550
?
?
?
?
?
?
(二)求1到100被3整除的数字相加的和
?
?
把奇数偶数都加起来
求1到100被3整除的数字相加的和
和上面的脚本使用同样的套路
[[email?protected] shell_scripts]# echo {3..100..3}
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
[[email?protected] shell_scripts]# cp for_sum.sh for_3sum.sh
[[email?protected] shell_scripts]# vim for_3sum.sh
[[email?protected] shell_scripts]# bash for_3sum.sh
1683
[[email?protected] shell_scripts]# cat for_3sum.sh
#!/bin/bash
#Author:wang
sum=0
for i in {3..100..3}
do
let sum=$((sum+i))
done
echo $sum
?
?
?
?
?
?
?
?
?
?
?
?
?
(三)求1到100不能被3整除的数字相加的和
?
?
判断对3取余数。
不等于有两种写法:
1[ ! "$yu" -eq 0 ]
2?[ "$yu" -ne 0 ]
?
法1:
[[email?protected] shell_scripts]# bash for_3sum.sh
3367 [[email?protected] shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in {1..100};do yu=$[i%3] if [ ! "$yu" -eq 0 ]; then
#注意这里是变量值最好加上双引号,不加也可以的。
let sum+=i fi done echo $sum
?
?
?
?
?
?
?
法2:
[[email?protected] shell_scripts]# bash for_3sum.sh
3367 [[email?protected] shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in {1..100};do yu=$[i%3] if [ "$yu" -ne 0 ]; then let sum+=i fi
#注意写脚本要养成良好的习惯,比如缩进要美观。
done echo $sum
?
?
?
?
?
?
[[email?protected] shell_scripts]# bash for_3sum.sh
3367 [[email?protected] shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in {1..100};do yu=$[i%3] if [ $yu -ne 0 ]; then let sum+=i fi #注意写脚本要养成良好的习惯,比如缩进要美观。 done echo $sum
?
?
?
?
?
?
?
法3
[[email?protected] shell_scripts]# bash for_3sum.sh
3367 [[email?protected] shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in `seq 1 100`;do if [ $[i%3] -ne 0 ]; then let sum+=i fi done echo $sum [[email?protected] shell_scripts]# vim for_3sum.sh [[email?protected] shell_scripts]# bash for_3sum.sh 3367 [[email?protected] shell_scripts]# cat for_3sum.sh #!/bin/bash #Author:wang sum=0 for i in `seq 1 100`;do if [ "$[i%3]" -ne 0 ]; then let sum+=i fi done echo $sum
?
?
?
?
?
?
?
?
?
?
(四)添加10个用户user91-user100,密码为8位随机字符
?
?
创建用户,并且每个用户设置初始口令,口令是随机的,并且放到文件里面。
?具体问题可以表现为添加10个用户user91-user100,密码为8位随机字符
?
完整脚本
[[email?protected] shell_scripts]# cat user_add.sh #!/bin/bash #Author=wang for i in `seq 91 100` ; do username=user$i useradd $username echo `openssl rand -base64 10| head -c 8` | passwd $username --stdin &>/dev/null done echo "finished"
?
?
?
?
?
?
执行结果
[ro[email?protected] shell_scripts]# bash user_add.sh finished
?
?
?
?
?
[[email?protected] shell_scripts]# cat /etc/passwd | tail user91:x:1038:1038::/home/user91:/bin/bash user92:x:1039:1039::/home/user92:/bin/bash user93:x:1040:1040::/home/user93:/bin/bash user94:x:1041:1041::/home/user94:/bin/bash user95:x:1042:1042::/home/user95:/bin/bash user96:x:1043:1043::/home/user96:/bin/bash user97:x:1044:1044::/home/user97:/bin/bash user98:x:1045:1045::/home/user98:/bin/bash user99:x:1046:1046::/home/user99:/bin/bash user100:x:1047:1047::/home/user100:/bin/bash [[email?protected] shell_scripts]#
?
?
?
?
[[email?protected] shell_scripts]# cat /etc/shadow | tail user91:$6$YCyBiaF/$vovuieWrGWXwhHpRwsuJc85JOlFwvrUG/hNiPyLsJkHgWQG2v4oTE.B/CRANjcOhDkHlylH3iBG4bggmzstO40:18076:0:99999:7::: user92:$6$mxAMFuM1$.PqkWeHq231BmmnYcglitPkK/b4KOTcwLkO.S7isn9TA6ToN/sFR5ASwVF9HCHilEArql5R1Z4md6.auRaYj..:18076:0:99999:7::: user93:$6$Ga0/IYjR$TfriwLrqxYsdTlfoRRDNDn8gFwajOkxc5McuxTwoIKGAgWrI8NiKA6ASi4IdYuI7iQ/c2LL4mAte/JCj8juS0.:18076:0:99999:7::: user94:$6$E9mnyuH7$HS/TqWuhn8E8DX/ghu2SSOohcJU4LfACYg/hmrW9KIc4wZlsN5e.1.Q1ezNSY/w7WyRYYV2c6A2ofUBau/Csj1:18076:0:99999:7::: user95:$6$J.ljQLDk$6NvXXxx58y7487X0yMIQneF0dZKaqswiWigTu9xwJ1njIQmijvrhCkpxPL6ITJGdMB/j8.tYddIzMcUwWGnUv0:18076:0:99999:7::: user96:$6$uomIKnzW$9Llzo.qKU9rwcOpU68B7Sml28HUkM1AY06D1k7q7dpITxCdY3IFWWrK11tpwa6SVv4Z.lOiZ.0qgwaq/MNrnz0:18076:0:99999:7::: user97:$6$NRvTnViz$11cdhUq/9eVRj2SX85HrA/pNyYwqNsNOSObShmBljygjb9wzEZaJ8nPim8ZIGum.DUgG1ni2N3OgukKJmXYbI.:18076:0:99999:7::: user98:$6$40KBqdzU$.zsRi7sIxmVd4NAH7v5UYiQmvTxNlBMjKrddE3li/dtMxoS6TUHq0mK7XQRu.j6p7WjIxhkOZRmJULDssvEwB0:18076:0:99999:7::: user99:$6$y2efTk7A$4e4IX9muy30fO6Vv2Q75sAPCrY1XDZecEqxV6f7ZJJPg4V6FpVvIV/lamVaAiSnMQtL1LtGPbSYOu3KWReVFZ1:18076:0:99999:7::: user100:$6$tlPd3FrP$74gH4aqmlZ3xvp3TbaHSlWMkuDHDVJpr2XARz0n46Wf7Ni3zk9Eei83NhZISw64NvjI/a.YaM5y7d0ypPrrDw.:18076:0:99999:7:::
?
?
?
?
?
?
?
脚本解析
生成随机口令并且作为创建用户的口令
把改口令成功的提示放到黑洞里面去。
echo `openssl rand -base64 10| head -c 8` | passwd $username --stdin &>/dev/null
?
?
?
?
[[email?protected] shell_scripts]# openssl rand -base64 10 Ey0PRDELAhuCfw== [[email?protected] shell_scripts]# openssl rand -base64 10 Th1mFK8i95hJOQ== [[email?protected] shell_scripts]# openssl rand -base64 Usage: rand [options] num where options are -out file - write to file -engine e - use engine e,possibly a hardware device. -rand file:file:... - seed PRNG from files -base64 - base64 encode output -hex - hex encode output
?
?
?
?
?
?
提示符和命令都打印出来了
head -c 8表示获取前几个字节
[[email?protected] shell_scripts]# openssl rand -base64 10| head -c 8 bZ4p1m1N[[email?protected] shell_scripts]# openssl rand -base64 10| head -c 8 4z3GSMHZ[[email?protected] shell_scripts]# openssl rand -base64 10| head -c 8 W2c+6e/b[[email?protected] shell_scripts]# openssl rand -base64 10| head -c 8;echo qBPnSsJt
?
?
?
?
?
?
只显示命令的结果,在命令后面加上echo就可以了
[[email?protected] shell_scripts]# openssl rand -base64 10| head -c 8;echo cQJIkYwR [[email?protected] shell_scripts]# openssl rand -base64 10| head -c 8;echo W+EX9dLc [[email?protected] shell_scripts]# openssl rand -base64 10| head -c 8;echo id5+GUME
?
?
?
?
?
[[email?protected] shell_scripts]# cat for1.sh -A #!/bin/bash$ #Author:wang$ for num in {10..2..1}$ #M-eM-^FM-^YM-eM-.M-^L4M-dM-8M-*M-fM-^UM-0M-eM-0M-1M-dM-<M-^ZM-fM-^IM-‘M-hM-!M-^L4M-fM-,M-!M-eM->M-*M-gM-^NM-/$ $ do $ echo "num is $num"$ done$ [[email?protected] shell_scripts]# cat for1.sh #!/bin/bash #Author:wang for num in {10..2..1} #写完4个数就会执行4次循环 do echo "num is $num" done
?
?
?
?
?
?
?
?
?
(五)定义网段的IP地址,测试其在是否开机启动
?
完整脚本
[[email?protected] shell_scripts]# cat scan_ip.sh #!/bin/bash #Author=wang net=192.168.137 for i in {1..6};do if ping -c1 -w1 $net.$i &> /dev/null;then echo $net.$i is up echo $net.$i >> /app/ip.log else echo $net.$i is down fi done #如果ping通了就显示其为开机的,并且放到文件里面去。 #如果ping不通就执行下一次循环。
?
?
?
?
?
?
执行结果
[[email?protected] shell_scripts]# vim scan_ip.sh [[email?protected] shell_scripts]# bash scan_ip.sh 192.168.137.1 is up 192.168.137.2 is down 192.168.137.3 is down 192.168.137.4 is down 192.168.137.5 is down 192.168.137.6 is down
?
?
?
?
?
?
?
脚本解析
net=192.168.137表示网络位,子网掩码是24
主机位for i in {1..6};do,我只选取了几台主机
ping -c1 -w1 ? $net.$i 因为涉及两个变量,都要加上$
?
?
?
?
?
?在运行的其实是网关
[[email?protected] shell_scripts]# cat /app/ip.log 192.168.137.1
?
?
?
?
?
?
bug1:?
脚本的执行效率不高,解决办法就是在后台执行
[[email?protected] shell_scripts]# ping 192.168.137.1 -c3 & [1] 1288 [[email?protected] shell_scripts]# PING 192.168.137.1 (192.168.137.1) 56(84) bytes of data. 64 bytes from 192.168.137.1: icmp_seq=1 ttl=128 time=0.190 ms 64 bytes from 192.168.137.1: icmp_seq=2 ttl=128 time=0.091 ms 64 bytes from 192.168.137.1: icmp_seq=3 ttl=128 time=0.158 ms --- 192.168.137.1 ping statistics --- 3 packets transmitted,3 received,0% packet loss,time 2000ms rtt min/avg/max/mdev = 0.091/0.146/0.190/0.042 ms
?
?
?
?
?
?
bug2:
?在后台执行不回车不会退出来,在脚本里面也是一样的
[[email?protected] shell_scripts]# ping 192.168.137.1 -c3 & wait [1] 1319 PING 192.168.137.1 (192.168.137.1) 56(84) bytes of data. 64 bytes from 192.168.137.1: icmp_seq=1 ttl=128 time=0.529 ms 64 bytes from 192.168.137.1: icmp_seq=2 ttl=128 time=0.131 ms 64 bytes from 192.168.137.1: icmp_seq=3 ttl=128 time=0.111 ms --- 192.168.137.1 ping statistics --- 3 packets transmitted,time 2001ms rtt min/avg/max/mdev = 0.111/0.257/0.529/0.192 ms [1]+ Done ping 192.168.137.1 -c3
?
?
?
?
[[email?protected] shell_scripts]# cat scan_ip.sh #!/bin/bash #Author=wang net=192.168.137 for i in {1..6};do { if ping -c1 -w1 $net.$i &> /dev/null;then echo $net.$i is up echo $net.$i >> /app/ip.log else echo $net.$i is down fi }& done [[email?protected] shell_scripts]# 192.168.137.1 is up 192.168.137.2 is down 192.168.137.3 is down 192.168.137.6 is down 192.168.137.5 is down 192.168.137.4 is down ^C
?
?
?
?
?
?
解决办法加上wait
现在执行效率提高了并且会退出
[[email?protected] shell_scripts]# bash scan_ip.sh
192.168.137.1 is up 192.168.137.2 is down 192.168.137.4 is down 192.168.137.3 is down 192.168.137.5 is down 192.168.137.6 is down [[email?protected] shell_scripts]# cat scan_ip.sh #!/bin/bash #Author=wang net=192.168.137 for i in {1..6};do { if ping -c1 -w1 $net.$i &> /dev/null;then echo $net.$i is up echo $net.$i >> /app/ip.log else echo $net.$i is down fi }& done wait #如果ping通了就显示其为开机的,并且放到文件里面去。 #如果ping不通就执行下一次循环。
?
?
?
?
?
?
bug3:
因为前面多次执行了脚步,在文件里面会生成重复的内容
[[email?protected] shell_scripts]# cat /app/ip.log 192.168.137.1 192.168.137.1 192.168.137.1
?
?
?
?
?
?
解决办法在脚本的第1行先清空文件内容?
[[email?protected] shell_scripts]# bash scan_ip.sh
192.168.137.1 is up 192.168.137.6 is down 192.168.137.5 is down 192.168.137.2 is down 192.168.137.4 is down 192.168.137.3 is down [[email?protected] shell_scripts]# cat /app/ip.log 192.168.137.1 [[email?protected] shell_scripts]# cat scan_ip.sh #!/bin/bash #Author=wang > /app/ip.log net=192.168.137 for i in {1..6};do { if ping -c1 -w1 $net.$i &> /dev/null;then echo $net.$i is up echo $net.$i >> /app/ip.log else echo $net.$i is down fi }& done wait #如果ping通了就显示其为开机的,并且放到文件里面去。 #如果ping不通就执行下一次循环。
?
?
?
?
?
?
?查看开机运行的主机的信息
[[email?protected] shell_scripts]# nmap -v -A 192.168.137.1 Starting Nmap 6.40 ( http://nmap.org ) at 2019-02-09 23:35 CST NSE: Loaded 110 scripts for scanning. NSE: Script Pre-scanning. Initiating ARP Ping Scan at 23:35 Scanning 192.168.137.1 [1 port] Completed ARP Ping Scan at 23:35,0.01s elapsed (1 total hosts) Initiating Parallel DNS resolution of 1 host. at 23:35 Completed Parallel DNS resolution of 1 host. at 23:35,0.08s elapsed Initiating SYN Stealth Scan at 23:35 Scanning 192.168.137.1 [1000 ports] Discovered open port 53/tcp on 192.168.137.1 Completed SYN Stealth Scan at 23:35,0.14s elapsed (1000 total ports) Initiating Service scan at 23:35 Scanning 1 service on 192.168.137.1 Completed Service scan at 23:35,1.24s elapsed (1 service on 1 host) Initiating OS detection (try #1) against 192.168.137.1 Retrying OS detection (try #2) against 192.168.137.1 NSE: Script scanning 192.168.137.1. Initiating NSE at 23:35 Completed NSE at 23:35,5.17s elapsed Nmap scan report for 192.168.137.1 Host is up (0.047s latency). Not shown: 999 closed ports PORT STATE SERVICE VERSION 53/tcp open tcpwrapped MAC Address: 00:50:56:E2:3D:B6 (VMware)
Aggressive OS guesses: Microsoft Windows 7 Enterprise (93%),Microsoft Windows XP SP3 (93%),DD-WRT v24-sp2 (Linux 2.4.37) (91%),
DVTel DVT-9540DW network camera (91%),Linux 3.2 (90%),BlueArc Titan 2100 NAS device (89%),Brother HL-5170DN printer (88%),
Pirelli DP-10 VoIP phone (88%),Aethra Starvoice 1042 ADSL router (87%),Brother HL-1870N printer (87%) No exact OS matches for host (test conditions non-ideal). Network Distance: 1 hop TCP Sequence Prediction: Difficulty=257 (Good luck!) IP ID Sequence Generation: Incremental TRACEROUTE HOP RTT ADDRESS 1 46.57 ms 192.168.137.1 NSE: Script Post-scanning. Read data files from: /usr/bin/../share/nmap OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 12.12 seconds Raw packets sent: 1044 (49.132KB) | Rcvd: 1036 (42.012KB)
?
?
?
?
?
法2:
把网段写死了,设置要扫描的网段是变化的,或者说是交互式的。
如果用户不是输入IP地址,那就要温馨提示请输入正确的地址
判断是否是IP地址可以使用正则表达式
[[email?protected]3 shell_scripts]# bash scan_ip.sh
192.168.137.1 is up 192.168.137.4 is down 192.168.137.2 is down 192.168.137.6 is down 192.168.137.3 is down 192.168.137.5 is down [[email?protected] shell_scripts]# cat /app/ip.log 192.168.137.1 is up [[email?protected] shell_scripts]# cat scan_ip.sh #!/bin/bash #Author=wang > /app/ip.log net=192.168.137 for i in {1..6};do { if ping -c1 -w1 $net.$i &> /dev/null;then echo $net.$i is up | tee -a /app/ip.log else echo $net.$i is down fi }& done wait #如果ping通了就显示其为开机的,并且放到文件里面去。 #如果ping不通就执行下一次循环。
?
?
?
?
?
?
?
ip="114.122.2.255";[[ "$ip" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] && echo true ||echo false
?
[[email?protected] shell_scripts]# bash scan_ip.sh please input the network(eg:192.168.137.0):1.1.1.1 scan_ip.sh: line 8: syntax error near unexpected token `||‘ scan_ip.sh: line 8: `|| { echo "please input a legal IP";exit 1 ;}‘ [[email?protected] shell_scripts]# cat scan_ip.sh #!/bin/bash #Author=wang > /app/ip.log net=192.168.137 read -p "please input the network(eg:192.168.137.0):" network [[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] || { echo "please input a legal IP";exit 1 ;} #||是不能写在开头的 for i in {1..6};do { if ping -c1 -w1 $net.$i &> /dev/null;then echo $net.$i is up | tee -a /app/ip.log else echo $net.$i is down fi }& done wait
?
?
?
?
?
?
[[email?protected] shell_scripts]# bash scan_ip.sh please input the network(eg:192.168.137.0):1 please input a legal IP [[email?protected] shell_scripts]# bash scan_ip.sh please input the network(eg:192.168.137.0):1.1.1.1 192.168.137.1 is up 192.168.137.5 is down 192.168.137.3 is down 192.168.137.6 is down 192.168.137.2 is down 192.168.137.4 is down [[email?protected] shell_scripts]# cat /app/ip.log 192.168.137.1 is up [[email?protected] shell_scripts]# cat scan_ip.sh #!/bin/bash #Author=wang > /app/ip.log net=192.168.137 read -p "please input the network(eg:192.168.137.0):" network [[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] || { echo "please input a legal IP";exit 1 ;} for i in {1..6};do { if ping -c1 -w1 $net.$i &> /dev/null;then echo $net.$i is up | tee -a /app/ip.log else echo $net.$i is down fi }& done wait #如果ping通了就显示其为开机的,并且放到文件里面去。 #如果ping不通就执行下一次循环。 #地址输入了之后要判断是否是一个地址,使用正则表达式
?
?
?
?
?只要前3段
[[email?protected] shell_scripts]# bash scan_ip.sh please input the network(eg:192.168.137.0):192.168.137.4 192.168.137.1 is up 192.168.137.5 is down 192.168.137.3 is down 192.168.137.6 is down 192.168.137.2 is down 192.168.137.4 is down [[email?protected] shell_scripts]# bash scan_ip.sh please input the network(eg:192.168.137.0):3 please input a legal IP [[email?protected] shell_scripts]# bash scan_ip.sh please input the network(eg:192.168.137.0):1.1.1.1 1.1.1.1 is up 1.1.1.2 is down 1.1.1.4 is down 1.1.1.5 is down 1.1.1.3 is down 1.1.1.6 is down [[email?protected] shell_scripts]# cat /app/ip.log 1.1.1.1 is up [[email?protected] shell_scripts]# ping 1.1.1.1 PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data. 64 bytes from 1.1.1.1: icmp_seq=1 ttl=128 time=11.2 ms 64 bytes from 1.1.1.1: icmp_seq=2 ttl=128 time=9.84 ms 64 bytes from 1.1.1.1: icmp_seq=3 ttl=128 time=12.7 ms 64 bytes from 1.1.1.1: icmp_seq=4 ttl=128 time=11.2 ms 64 bytes from 1.1.1.1: icmp_seq=5 ttl=128 time=10.0 ms 64 bytes from 1.1.1.1: icmp_seq=6 ttl=128 time=10.8 ms 64 bytes from 1.1.1.1: icmp_seq=7 ttl=128 time=11.5 ms 64 bytes from 1.1.1.1: icmp_seq=8 ttl=128 time=9.92 ms ^C --- 1.1.1.1 ping statistics --- 8 packets transmitted,8 received,time 7015ms rtt min/avg/max/mdev = 9.847/10.923/12.709/0.912 ms
?
?
?
?
?
?
?
?
[[email?protected] shell_scripts]# cat scan_ip.sh #!/bin/bash #Author=wang > /app/ip.log net=192.168.137
#这行是可以不要的,但是因为后面的变量会覆盖的,所以保留也不影响的。
read -p "please input the network(eg:192.168.137.0):" network [[ "$network" =~ ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] || { echo "please input a legal IP";exit 1 ;} net=`echo $network | cut -d. -f1-3` for i in {1..6};do { if ping -c1 -w1 $net.$i &> /dev/null;then echo $net.$i is up | tee -a /app/ip.log else echo $net.$i is down fi }& done wait #如果ping通了就显示其为开机的,并且放到文件里面去。 #如果ping不通就执行下一次循环。 #地址输入了之后要判断是否是一个地址