Linux 第41,42天 脚本语法和脚本练习

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. 耐心等待命令执行完成,完成后重启机器便可恢复系统


猜你喜欢

转载自blog.51cto.com/winthcloud/2168754
今日推荐