1、写一个脚本,输入数字后执行对应命令: 1 date 2 ls 3 who 4 pwd
难点:在于用read -p 来采集用户的数据,然后用 case 循环来判断;
[root@localhost_002 shell100]# cat 9.sh
#!/bin/bash
echo "cmd meau** 1 - date 2 - ls 3 - who 4 - pwd"
read -p "please input a number1-4: " n
if [ -z "$n" ]
then
echo "The value empty"
exit
fi
n1=`echo $n|sed 's#[0-9]##g'`
if [ -n "$n1" ]
then
echo "you is not number;"
exit
fi
case $n in
1)
date
;;
2)
ls
;;
3)
who
;;
4)
pwd
;;
*)
echo "you is not 1-4;"
;;
esac
[root@localhost_002 shell100]# sh 9.sh
cmd meau** 1 - date 2 - ls 3 - who 4 - pwd
please input a number1-4: 2
1 1.txt 3.sh 4.sh 5.sh 6.sh 7.sh 8_1.sh 8.sh 9.sh lanmp.sh nohup.out
2、在linux系统下生成user00_user_09这10个用户,并设置随机10位的密码,把用户名和密码定向到一个文件/tmp/pw.txt里;
难点:生成密码时,需要使用密码生成工具 mkpasswd -l 10 -s 4 或者用系统自带变量 echo $RANDOM|md5sum|cut -c 1-10
[root@localhost_002 shell]# echo $RANDOM|md5sum|cut -c 1-10
6fd424ad94
[root@localhost_002 shell]# mkpasswd -l 10 -s 4
z{!W96J'=e
mkpasswd -l 10 -s 4 ( -l 密码长度 -s 特殊字符 -d 数字) == echo $RANDOM|md5sum|cut -c 1-10 (RANDOM系统变量) $RANDOM|md5sum
seq -w 0 50 以最长的宽度为准;表示以最后一位值得宽度为准; seq 0 2 10 指定步长增值2; 会打印 0 2 4 6 8
[root@localhost_002 shell]# seq 0 2 10
0
2
4
6
8
10
seq -w 0 10 表示会以 10 为准, 打印 00 01 02 03 04 05 06 07 08 09 10
脚本内容如下: 需要用for 循环,然后打印pw的密码,然后用 echo "密码" |passwd -stdin user 来更新密码,最后写入到同一个文件/tmp/pw.txt
[root@localhost_002 shell100]# cat 10.sh
#!/bin/bash
for u in `seq -w 0 09`
do
pw=`mkpasswd -l 10 -s 4`
# pw=`echo $RANDOM|md5sum|cut -c 1-10`
useradd use_$u
echo "$pw"|passwd --stdin use_$u >/dev/null 2>&1
echo "use_$u $pw" >> /tmp/pw.txt
done
[root@localhost_002 shell100]# cat /tmp/pw.txt
use_00 MZ(~2eo,)5
use_01 6Q*9Z\}kg\
use_02 i9_U5kB:*&
use_03 VN2~_'on|5
use_04 &Y%e7"F'l1
use_05 gG[#8pI3'^
2、删除用户:有如下两种方法:
通过在/etc/passwd来过滤出第一行的用户: cat /etc/passwd|grep 'use'|cut -d ':' -f 1 ;然后userdel 删除用户命令;
通过 for 循环来打印,然后执行 userdel 删除用户命令;
[root@localhost_002 shell100]# cat 10_1.sh
#!/bin/bash
for i in `cat /etc/passwd|grep 'use'|cut -d ':' -f 1`
do
userdel -r $i >/dev/null 2>&1
done
第二种方法:通过 for 循环来打印,然后执行 userdel 删除用户命令;
[root@localhost_002 shell100]# cat 10_3.sh
#!/bin/bash
for i in `seq -w 00 50`
do
userdel -r use_$i >/dev/null 2>&1
done
注释: seq 0 2 10 表示增值为2;打印 0 10;
[root@localhost_002 shell100]# seq 0 2 10
0
2
4
6
8
10
注释: echo "$pw"|passwd --stdin use_$u >/dev/null 2>&1 == echo -e "$pw\n$pw\n" |passwd use_$u
3、监控httpd的进程;每隔10s检测一次服务器的httpd的进程数,如果大于500则自动重启httpd服务;并检测是否启动成功;
如果没有正常启动还需要再启动一次,最大不成功数超过五次立即发邮件给管理员;并且不需要在检测;
如果启动成功后,1分钟后检测httpd的进程数,若正常则重启之前10s检测一次,若还是大于500则发邮件给管理员,并自动退出此脚本;
注释: 统计进程个数的命令: ps -C nginx --no-heading|wc -l ==== pgrep -l nginx|wc -l
思路:每10秒检测一次,那只能用死循环 while;
检测是否启动成功的命令可以用 echo $? 来判断返回值;
如果启动不成功,启动五次可以用计数器来判断;超过5次则发邮件告警;
[root@localhost_002 shell100]# cat 11.sh
#!/bin/bash
check_service()
{
n=0
for i in `seq 1 5`
do
/etc/init.d/nginx restart 2>> /tmp/nginx.err
if [ $? -ne 0 ]
then
n=$[$n+1]
else
break
fi
done
if [ $n -eq 5 ]
then
python mail.py "yuanhh@163.com" "The is http down"
exit
fi
}
while :
do
n=`pgrep -l nginx|wc -l`
if [ $n -ge 500 ]
then
/etc/init.d/nginx restart
if [ $? -ne 0 ]
then
check_service
fi
sleep 60
t_n=`pgrep -l nginx|wc -l`
if [ $_n -ge 500 ]
then
python mail.py "yuanhh@163.com" "http service is down" "the httpd is budy;"
fi
fi
sleep 10
done
注释:check_server 为自定义的函数,用来统计nginx 启动不成功时的计数, n 是一个计数器,每次重启不成功都会加1,超过5次后则发邮件告警退出,如果重启成功了则break(跳出for循环)了:
4、根据web服务器的访问日记,把一些请求量比较高的IP给拒绝掉,并且每隔d把请求量小的IP解封;
假设:一分钟请求量高于100次的IP则不正常; 访问日记路径为/data/logs/access.log
首先需要打印出上一分钟的日记内容;t1=`date -d "-1 min" +%Y:%H:%M`
t1=`date -d "-1 min" +%Y:%H:%M`
egrep "$t1:[0-9]+" 1.log|awk '{print $1}' #过滤出来上一分钟的日记内容; 加 号 表示一次多次;
[root@localhost_002 shell100]# cat 12.sh
#!/bin/bash
block_ip(){
t=`date -d "-l min" +%Y:%H:%M`
logs=/usr/local/nginx/logs/access.log
n=egrep "$t[0-9]+" 1.log > /tmp/tmp_min.log
awk '{print $1}' /tmp/tmp_min.log|sort -n|uniq -c|sort -n|awk '$1>100 {print $2}' > /tmp/badip.list
n-`wc -l /tmp/badip.list`
if [ $n -ne 0 ]
then
for ip in `cat /tmp/badip.list`
do
iptables -I INPUT -s $ip -j REJECT
done
fi
}
unblock_ip()
{
iptables -nvL INPUT|sed '1,2d'|awk '$<5 print $8' > /tmp/goodip.list
n=`wc -l /tmp/goodip.list|awk '{print $1}'`
if [ $n -ne 0 ]
then
for i in `cat /tmp/goodip.list`
do
iptables -D INPUT -s $ip -j REJECT
done
fi
iptables -Z
}
d=`date +%M`
if [ $d == "00" ] || [$d == "30" ]
then
unblock_ip
block_ip
else
block_ip
fi
5、算数字:
请仔细阅读如下数字,并使用shell脚本输出后面的10个 数字;
10 31 53 77 105 141 .............
首先寻找规律; 寻找差值,假设第一行差值定义成 x 第二行差值定义成 y 第三行差值定义成 z;
10 31 53 77 105 141
21 22 24 28 36
1 2 4 8
首先计算第三行的差值 z; 分别是2 的 0 次方 1次方 2次方 3次方;
第一行的第一个数字是10,第二行的第一个数字是21,第三行数字就是2的幂次方;做一个for 循环;
每一次循环,第二行数字数字加上第三行的差值得到第二行的下个数字,第一行的数字需要加上第一行的下一个数字,得到第一行的下一个数字;
for i seq `0 4`;do z=$[2**$i]; echo $z;done
[root@localhost_002 shell100]# for i in `seq 0 3`;do z=$[2**$i];echo $z;done
1
2
4
8
然后计算第二行的差值 y ; 可知 y的初始值时21,每次在它基础上加上 2 的 n 次方;
y=21;for i in 'seq 0 4'; do echo $y; z=$[2**2]; y=$[$y+$z];done
[root@localhost_002 shell100]# y=21;for i in `seq 0 3`;do echo $y;z=$[2**$i];y=$[$y+$z];done
21
22
24
28
求x: 可知 x 的初始值是 10, 然后每次分别加上 y 的值, 求出下一个值;
x=10;y=21;for i in `seq 0 4`; do echo $x; x=$[$x+$y];z=[2**$i];y=$[$y+$z];done
[root@localhost_002 shell100]# x=10;y=21;for i in `seq 0 4`; do echo $x;x=$[$x+$y];z=$[2**$i];y=$[$y+$z];done
10
31
53
77
105
脚本格式如下:
[root@localhost_002 shell100]# cat 15.sh
#!/bin/bash
x=10
y=21
for i in `seq 0 10`
do
echo $x
x=$[$x+$y]
z=$[2**$i]
y=$[$y+$z]
done