Linux 第41,42天 脚本语法和脚本练习
时间: 20180831
时间: 20180901
目录
循环控制break,continue,while,until,for,case,select
制作一个生成等腰三角形的脚本
脚本制作一个国际象棋棋盘
脚本: 使用while read line;do ... done;制作检查硬盘容量超过某值时告警
脚本: 检查访问本机的IP连接认证失败次数大于某数值时将其添加至黑名单中
脚本: 设置某个阀值,当某个IP连接大于某个值时将其放至iptables中拒绝登录
脚本: 求100以内所有正奇数之和(while实现)
脚本: 提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
脚本: 后续六个字符串(解密)
脚本编写总结
实验: 删除centos5,6的/boot/目录下的initrd文件并修复
循环控制
break
continue
while list-1; do list-2; done
until list-1; do list-2; done
for (( expr1 ; expr2 ; expr3 )) ; do list ; done
case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
select NAME [in WORDS ... ;] do COMMANDS; done
这个循环可以制作一个菜单,用来显示,如我们前边已经制作了许多脚本
可以用这个菜单来将其显示出来,然后再根据我们相应的选择来执行相应的脚本
我这里做一个示例,只是演示哈,没有任何实际操作,这个循环有几个变量
此循环不会自动退出,除非用户定义一个break当执行到此时才会退出
PS3此变量用来控制输出提示符
REPLY此变量用来调取用户输入的内容
#!/bin/bash
PS3="select: "
select EX in {showIP,initialHost,HWInfo,quitSH};do
case $EX in
showIP)
echo "Your Choice is $REPLY"
echo $EX
;;
initialHost)
echo "Your Choice is $REPLY"
echo $EX
;;
HWInfo)
echo "Your Choice is $REPLY"
echo $EX
;;
quitSH)
echo "Your Choice is $REPLY"
echo $EX
break
;;
*)
echo "Error Choice, Try again."
;;
esac
done
while read line;do
line是一个变量,此循环可以接一个文档或列表,循环执行时每次读取文档或列表中
的一行,直到将所有行读完为止
如:
cat /etc/passwd|while read NAME;do
echo $NAME
sleep 1
done
会一行一行的输出文档里的内容,你可以对每一行执行一些控制操作
还有一种读取文档的方式
while read NAME;do
echo $NAME
sleep 1
done < /etc/passwd
和上述的例子含义一样,只是语法有一些变化
制作一个生成等腰三角形的脚本
#!/bin/bash
read -p "Please input a range of triangle(Number): " Line
for ((i=1;i<=$Line;i++));do
Star=$[$i*2-1]
Space=$[$Line-$i]
start=1
until [ $start -gt $Space ];do
echo -n " "
start=`expr $start + 1`
done
start=1
while [ $start -ne $[$Star+1] ];do
echo -n "*"
start=$(($start+1))
done
echo
done
#此脚本可以简化这里这么做只是为了复习一下之前学的知识
脚本制作一个国际象棋棋盘
#!/bin/bash
color (){
color1=$[$RANDOM%7+1]
color2=$[$RANDOM%7+1]
}
color
if [ "$color1" -eq "$color2" ];then
color
fi
column=8
for I in {1..8};do
column=1
until [ $column -eq 5 ];do
if [ $[$I%2] -eq 0 ];then
echo -e "\033[4${color1}m \033[0m\033[4${color2}m \033[0m\c"
let column++
else
echo -e "\033[4${color2}m \033[0m\033[4${color1}m \033[0m\c"
let column++
fi
done
echo
done
脚本: 使用while read line;do ... done;制作检查硬盘容量超过某值时告警
#!/bin/bash
warning=10
df | grep "^/dev/"| awk '{print $1,$5}'|while read DISK;do
partition=`echo $DISK|sed -nr 's/(.*) [0-9]+%/\1/p'`
Usage=`echo $DISK|sed -nr 's/.* ([0-9]+)%/\1/p'`
if [ "$Usage" -gt "$warning" ]; then
echo -e "The Partition \033[32m$partition\033[0m is ${Usage}%"
fi
done
脚本: 检查访问本机的IP连接认证失败次数大于某数值时将其添加至黑名单中
#!/bin/bash
# Version 1
trigger=2
lastb| grep -Eo "([[:digit:]]{1,3}\.){1,3}[[:digit:]]{1,3}"
| sort -n| uniq -c|while read DATA;do #此行与上一行为一行命令
count=`echo $DATA|cut -d ' ' -f 1`
IP=`echo $DATA|cut -d ' ' -f 2`
if [ "$count" -gt "$trigger" ];then
grep -q $IP /etc/hosts.deny || echo $IP >> /etc/hosts.deny
fi
done
脚本: 设置某个阀值,当某个IP连接大于某个值时将其放至iptables中拒绝登录
#!/bin/bash
warning=2
ss -nt | grep -v "^Stat" |awk '{print $5}'| cut -d: -f1| sort -n|
uniq -c| while read IP;do #此行与上一行是连在一起的
TIME=$(echo $IP|cut -d ' ' -f1)
denyIP=$(echo $IP|cut -d ' ' -f2)
if [ "$TIME" -gt $warning ];then
iptables -nL | grep -q $denyIP && continue
iptables -A INPUT -s $denyIP -j REJECT && echo "$denyIP was deny"
fi
done
脚本: 求100以内所有正奇数之和(while实现)
#!/bin/bash
sum=0
num=1
while [ "$num" -le 100 ]; do
let sum+=$num
let num=$num+2
done
echo $sum
脚本: 提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,
并统计在线和离线主机各多少(待优化,这个脚本无法并行执行,查个C网段需要一些时间)
#!/bin/bash
read -p "Please input a C network: " Network
num=1
net=`echo $Network|cut -d'.' -f 1-3`
upIP=0
downIP=0
while [ $num -le 254 ]; do
ping -c 1 -W 1 $net.$num &>/dev/null && let upIP++ || let downIP++
let num++
done
if [ "$upIP" -eq "$downIP" ];then
echo -e "The net $Network all \033[1;31mDown\033[0m"
else
echo "The net UP $upIP hosts, Down $downIP hosts."
fi
unset net upIP downIP num Network
脚本: 后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b
ad865d2f63是通过对随机数变量RANDOM随机执行命令:
echo $RANDOM|md5sum|cut –c1-10 后的结果,请破解这些字符串对应的RANDOM值
#!/bin/bash
for I in {efbaf275cd,4be9c40b8b,44b2395c46,f8c8873ce0,b902c16c8b,ad865d2f63};do
md5=0
until [ "$sum" = "$I" ];do
sum=`echo $md5| md5sum | cut -c1-10`
let md5++
done
echo $md5
done
脚本编写总结
1. 为变量赋值时如果前边有空格时会被自动去除然后再赋值给变量
2. 尽量做语法对齐对以后学习python打好基础
3. Ctrl+s可以锁屏,但是依然可以输入命令只是不显示在屏幕上。
Ctrl+q退出此模式
4. 编程思想在于编程所采用的方法,即如何把现实化的事情数字化,算法
5. 脚本出现无法预知的错误时可以使用bash -x 加脚本名来使脚本一条一条执行显示
其执行步骤,用来查错,非常好用
6. select 是一个死循环他会打印你所给的列表,并为列表中的每一个元素定义一个数值
你选择相应的数值可以调取出相应数值的元素,常与case结合使用
Linux 启动流程
POST (Power On Self Test) --> MBR --> GRUB --> 加载内核
MBR(bootloader)
stage1 读取时是直接指针指向这个地址,并将其数据调入内存中来执行
stage1.5 是由stage1指针指向stage1.5来将其数据调入内存中来执行
到此时stage1.5有识别文件系统的能力此时,便可读取/boot/grub2
里的执行启动文件
实验: 删除centos5,6的/boot/目录下的initrd文件并修复
修复原理,如果initrd文件被误删除后,需要找一个其它linux启动盘或CentOS
官方的光盘,进入其救援权限,启动此机器然后切根chroot至真正的
硬盘系统根执行mkinitrd命令(其实是一个脚本)调用了dracut命令该
命令是一个非常低层的命令,用来生成一个initramfs image.由于需要
加很多选项非专业人士很难操作,所以就出现了mkinitrd脚本用它来调用
dracut命令生成initramfs文件,用户只需要输入几个简单的参数便可
修复步骤
1. 先破坏,故意删除initrd文件,用来模拟此文件损坏(测试机执行,可别生产)
rm -f /boot/
2. 重启进入光盘的救援模式并切根(如果默认检测到硬盘会挂载至/mnt/sysimags)
此时只需要切根即可,如果不是则需要自行挂载
chroot /mnt/sysimags
3. 切根后只需要使用命令mkinitrd来重新生成initramfs文件即可
mkinitrd /boot/initramfs-$(uname -r).img $(unamr -r)
命令的参数一个是要生成的文件路径和名称,然后指定内核版本
命令执行完成后可以查看该目录下是否生成指定的文件
需要注意的是文件的命名方式必须是上述的格式,否则还是启动不了哦
4. 耐心等待命令执行完成,完成后重启机器便可恢复系统