1、批量生成随机字符文件名
使用for 循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下:
[root@shiyanji ~]# ls /oldboy/
aebecfecbd_oldboy.html baaaafbcda_oldboy.html ccdeadaebe_oldboy.html ceefcaaffc_oldboy.html deacbedcdb_oldboy.html
afcbdeeafc_oldboy.html bbbceadeef_oldboy.html cdedcfadec_oldboy.html dcdbedaace_oldboy.html ecfebeaaaf_oldboy.html
解答:
[root@shiyanji scripts]# vim ti1.sh #!/bin/bash Path=/oldboy [ -d "$Path" ] || mkdir -p /oldboy for i in `seq 10` do name=$(echo $RANDOM|sha512sum|sed 's#[^a-z]##g'|cut -c 1-10) touch $Path/${name}_oldboy.html done
2、批量改名
将上题中的oldboy字符串全部改成oldgirl(最好用for循环实现),并且将扩展名html全部改成大写。
解答:
[root@shiyanji scripts]# vim ti2.sh #!/bin/bash cd /oldboy 要先进入目录再ls,不然会报错
for i in `ls` do name=$(echo $i|awk -F "_" '{print $1}') mv $i ${name}_oldgirl.HTML done
3、批量创建特殊要求用户
批量创建10个系统账号oldboy01-oldboy10并设置密码(密码为随机数,要求是字符和数字等的混合)。
不使用for循环做法
seq -w 10|sed 's#.*#useradd oldboy&;a=`echo $RANDOM|sha512sum|cut -c 1-10`;echo $a|passwd --stdin oldboy&;echo oldboy& $a >>/tmp/mima#ge'
说明:
e 等于bash
-w 平衡宽度用前导零填充
使用for循环脚本
[root@shiyanji scripts]# vim ti3.sh #!/bin/bash for user in oldboy{01..10} do mima=$(echo $RANDOM|sha512sum|cut -c 1-10) useradd ${user} && echo ${mima}|passwd --stdin ${user} echo ${user} ${mima} >>/tmp/new done
4、扫描网络内存活主机
写一个Shell脚本,判断10.0.0.0/24网络里,当前在线的IP有哪些?
解答:
#!/bin/bash for i in 10.0.0.{1..254} do { ping -w 2 -c 2 $i &> /dev/null if [ $? -eq 0 ];then echo "$i is ok" fi }& done
说明:
ping -c count次数 -w 延期时间
. /etc/init.d/functions 调用这个库
action $i /bin/true 固定格式(把$i以这个库的true格式显示)
action $i /bin/false 固定格式(把$i以这个库的false格式显示)
& Shell的并发检测功能,批量ping,快速返回结果
5、解决DOS攻击
写一个Shell脚本以解决DOS攻击生产的问题
请根据Web日志或网络连接数,监控当某个IP并发连接数或短时内PV达到100(读者可根据实际情况来设定)时,即调用防火墙命令封掉对应的IP。防火墙命令为:"iptables -I INPUT -s IP -j DROP"(IP为要封的地址)。
解答:
[root@shiyanji scripts]# vim ti5.sh #!/bin/bash logfile=/tmp/access_2010-12-8.log PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" export PATH touch /tmp/ip_drop.log while true do awk '{print $1}' $logfile|sort|uniq -c >/tmp/dos.log while read line do arr=($line) if [ ${arr[0]} -gt 10 -a `grep ${arr[1]} /tmp/ip_drop.log|wc -L` -lt 1 ];then iptables -I INPUT -s ${arr[1]} -j DROP && echo ${arr[1]} >>/tmp/ip_drop.log fi done </tmp/dos.log sleep 3 done
说明:
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export PATH 定义变量(后面就不用写全路径了)
测试: iptables -nL 查看封的IP iptables -F 清空规则
6、MySQL数据库分库备份
请用脚本实现对MySQL数据库的分库备份。
解答:
[root@db01 scripts]# vim ti6.sh #!/bin/bash user=root passwd=oldboy123 login="mysql -u$user -p$passwd" dump="mysqldump -u$user -p$passwd" DATABASE=$($login -e "show databases;"|egrep -v "*schema|mysql|Database") mkdir -p /opt/backup for database in $DATABASE do $dump $database |gzip >/opt/backup/${database}_$(date +%F).sql.gz
说明:
mysqldump -uroot -poldboy123 |gzip >/opt/oldboy_$(date +%F).sql.gz 全备份命令
mysql -uroot -poldboy123 -e "show databases;"|egrep -v "*schema|mysql|Database" 排除没用库
7、MySQL数据库分库分表备份
请用脚本实现对MySQL数据库的分库加分表备份。
解答:
[root@db01 scripts]# vim ti7.sh #!/bin/bash user=root passwd=oldboy123 login="mysql -u$user -p$passwd" dump="mysqldump -u$user -p$passwd" DATABASE=$($login -e "show databases;"|egrep -v "*schema|mysql|Database") mkdir -p /opt/backup for database in $DATABASE do TABLE=$($login -e "use oldboy;show tables;"|sed '1d') for table in $TABLE do [ -d /opt/backup/$database ] || mkdir -p /opt/backup/$database $dump $database $table |gzip >/opt/backup/$database/${database}_${table}_$(date +%F).sql.gz done done
说明:
mysql -uroot -poldboy123 -e "use oldboy;show tables;" 命令行显示表
mysql -uroot -poldboy123 -e "use oldboy;show tables;"|sed '1d' 排除第一行
8、筛选符合长度的单词案例
利用bash for循环打印下面这句话中字母数不大于6的单词(某企业面试真题)。
I am oldboy teacher welcome to oldboy trainingclass
解答:
[root@shiyanji scripts]# vim ti8.sh #!/bin/bash for i in I am oldboy teacher welcome to oldboy trainingclass do if [ ${#i} -lt 6 ];then echo "$i" fi done
9、MySQL主从复制异常监控案例
开发一个守护进程脚本每30秒监控MySQL主从复制是否异常(包括不同步以及延迟),如果异常,则发送短信并发送邮件给管理员存档。提示:如果没主从复制的环境,可以把下面文本放到文件里读取来模拟主从复制状态:
解答:
[root@db02 scripts]# vim ti9.sh . /etc/init.d/functions PATH="/application/mysql/bin/:$PATH" while true do wx=($(mysql -e "show slave statusG"|egrep "_Running: Yes|Behind_Master: 0"|wc -l)) if [ $wx -eq 3 ] then action "mysql slave 一切正常" /bin/true else action "mysql slave 出现异常" /bin/false fi sleep 30 done
10、比较整数大小经典案例
综合实战案例:开发shell脚本分别实现以脚本传参以及read读入的方式比较2个整数大小。用条件表达式(禁止if)进行判断并以屏幕输出的方式提醒用户比较结果。注意:一共是开发2个脚本。当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数不对给予提示。
解答:
[root@shiyanji scripts]# vim ti10.sh #!/bin/bash while true do read -p "请输入第一个数字:" a read -p "请输入第二个数字:" b [ -z "$a" ] || [ -z "$b" ] && { echo "输入有误,请输入一个数字" exit 2 } expr $a + $b + 10 &>/dev/null PDZ=$? [ $PDZ -eq 0 ] || { echo "输入有误,请输入一个数字" exit 2 } [ $a -lt $b ] && echo "$a < $b" [ $a -eq $b ] && echo "$a = $b" [ $a -gt $b ] && echo "$a > $b" done
说明:
-p 设置提示语句
-z 判定字符串长度
[ $PDZ -eq 0 ] 判定的是整数
11、菜单自动化软件部署经典案例
综合实例:打印选择菜单,按照选择一键安装不同的Web服务。
示例菜单:
[root@oldboy scripts]# shmenu.sh
1.[install lamp]
2.[install lnmp]
3.[exit]
pls input the num you want:
要求:
1、当用户输入1时,输出“startinstalling lamp.提示”然后执行/server/scripts/lamp.sh,脚本内容输出"lampis installed"后退出脚本,工作中就是正式lamp一键安装脚本;
2、当用户输入2时,输出“startinstalling lnmp.提示” 然后执行/server/scripts/lnmp.sh输出"lnmpis installed"后退出脚本,工作中就是正式lnmp一键安装脚本;
3、当输入3时,退出当前菜单及脚本;
4、当输入任何其它字符,给出提示“Input error”后退出脚本;
5、要对执行的脚本进行相关的条件判断,例如:脚本文件是否存在,是否可执行等判断,尽量用上前面讲解的知识点。
解答:
[root@shiyanji scripts]# vim ti11.sh #!/bin/bash while true do clear cat <<EOF 1.[install lamp] 2.[install lnmp] 3.[exit] EOF read -p "pls input the num you want:" a case "$a" in 1) echo "startinstalling lamp" sleep 3 ;; 2) echo "startinstalling lnmp" sleep 3 ;; 3) echo "ByeBye" sleep 3 exit 1 ;; *) echo "input error" sleep 3 ;; esac done
12、Web及MySQL服务异常监测案例
用if条件语句实现对Nginx Web服务以及MySQL数据库服务是否正常进行检测,如果服务未启动,则启动相应服务。
解答:
使用wget或curl命令访问URL地址来测试:
第一种:使用curl脚本:
[root@web01 scripts]# vim ti12.sh CMD=$(curl -o /dev/null -sL 10.0.0.8 -w "%{http_code} "|grep -E "200|301|302"|wc -l) if [ $CMD -eq 1 ];then echo "Web服务运行正常" else echo "Web服务运行异常,没有启动Nginx,正在启动Nginx" /application/nginx/sbin/nginx sleep 2 fi
说明:
通过curl命令进行测试,执行curl命令之后,查看个数,1为正常
curl -o /dev/null -sL 10.0.0.8 -w "%{http_code} "|grep -E "200|301|302"|wc -l
-o /dev/null 指定输出为空
-s 不输出内容
L 指定地址
-w "%{http_code} " 状态码
-E grep用到正则了加-E
200、300、302 都表示正常(因为判断的服务运行)
第二种:使用wget脚本
[root@shiyanji scripts]# vim ti12.sh #!/bin/bash wget -T 2 -t 2 --spider 10.0.0.8 &>/dev/null if [ $? -eq 0 ];then echo "Web服务一切正常" else echo "Web服务出现异常,没有启动Nginx,正在启动Nginx"" /application/nginx/sbin/nginx sleep 2
说明:
通过$?返回值来判断Web服务,为0则正常
wget -T 2 -t 2 --spider 10.0.0.8 &>/dev/null
-T 超时时间(timeout)
-t 重试次数(tries)
--spider 模拟抓取
还是查端口简单粗暴:
[root@shiyanji scripts]# vim 12l.sh #!/bin/bash CMD=$(lsof -i:80|wc -l) if [ $CMD -ef 3 ] echo "Nginx运行正常" else echo "Nginx没有开启,正在开启Nginx" /application/nginx/sbin/nginx sleep 2 fi
MySQL脚本:
[root@db01 scripts]# vim ti12.sh CMD=$(ps -ef|grep mysql|wc -L) if [ $CMD -eq 287 ];then echo "MySQL一切正常" else echo "MySQL没有启动";/etc/init.d/mysqld start fi
说明:
通过开启MySQL和没开启时$?的返回值来判定是否开启MySQL
13、监控Memcached缓存服务是否正常
监控Memcached缓存服务是否正常,模拟用户(web客户端)检测。
使用nc命令加上set/get来模拟检测。
解答:
环境准备:
yum -y install libevent-devel 安装依赖关系 yum -y install memcached 安装memcached memcached -m 16m -c 2048 -u root -p 11211 -d 启动memcached
脚本:
[root@shiyanji scripts]# vim ti13.sh #!/bin/bash if [ `netstat -tunpl|grep 11211|wc -l` -lt 1 ];then echo "Memcache server is error." exit 1 fi printf "del key " |nc 127.0.0.1 11211 &>/dev/null printf "set key 0 0 10 oldboy1234 "|nc 127.0.0.1 11211 &>/dev/null CDM=$(printf "get key "|nc 127.0.0.1 11211|grep oldboy1234|wc -l) if [ $CDM -eq 1 ] then echo "Memcached status is ok" else echo "Memcached status is bad" fi
说明:
printf "del key " |nc 127.0.0.1 11211 &>/dev/null 删除缓存中的key及对应的值
printf "set key 0 0 10 oldboy1234 "|nc 127.0.0.1 11211 &>/dev/null 添加新值
printf "get key "|nc 127.0.0.1 11211|grep oldboy1234|wc -l 查看新值
14、开发脚本入侵检测与报警案例
面试及实战考试题:监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了),如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次。
解答:
[root@shiyanji scripts]# vim ti14.sh #!/bin/bash #huanjingbushu mkdir -p /var/html/www cp -a /etc/a* /var/html/www/ find /var/html/www -type f|xargs md5sum >/opt/md5sum.txt while true do md5sum=$(md5sum -c /opt/md5sum.txt |awk '{print $2}'|egrep "FAILED"|wc -l) ge=$(tree /var/html/www/|tail -1|awk '{print $1,$3}'|sed 's# ##g') if [ $md5sum -gt 0 ] || [ $ge -ne 1163 ] then echo "Web目录有变动" sleep 2 else : fi done
说明:
1、对站点/var/html/www/下的文件生成指纹然后比对指纹看是否有变化
2、指纹比对对文件/目录的创建监控不了,所以用tree|wc -l查看个数对比进行监控
相关命令
find /var/html/www -type f|xargs md5sum >/opt/md5sum.txt 生成指纹
md5sum -c /opt/error.txt 指纹验证
18、破解RANDOM随机案例
已知下面的字符串是通过RANDOM随机数变量md5sum后,再截取一部分连续字符串的结果,请破解这些字符串对应的使用md5sum处理前的RANDOM对应的数字?
21029299
00205d1c
a3da1677
1f6d12dd
890684b
解答:
[root@shiyanji scripts]# vim 18.sh #!/bin/bash array=( 21029299 00205d1c a3da1677 1f6d12dd 890684b ) for i in {0..32767} do echo $i|md5sum >/tmp/md5sum.txt for n in ${array[*]} do grep $n /tmp/md5sum.txt if [ $? -eq 0 ] then echo "$i is $n" fi done done
结果如下:
[root@shiyanji scripts]# sh 18.sh 00205d1cbbeb97738ad5bbdde2a6793d - 1346 is 00205d1c 1f6d12dd61b5c7523f038a7b966413d9 - 7041 is 1f6d12dd 890684ba3685395c782547daf296935f - 10082 is 890684b a3da1677501d9e4700ed867c5f33538a - 25345 is a3da1677 2102929901ee1aa769d0f479d7d78b05 - 25667 is 21029299
说明:
32767出处
man bash然后输入/RANDOM
19、批量检查多个网站地址是否正常
企业面试题:批量检查多个网站地址是否正常
要求:
1、使用shell数组方法实现,检测策略尽量模拟用户访问。
2、每10秒钟做一次所有的检测,无法访问的输出报警。
3、待检测的地址如下
http://blog.oldboyedu.com
http://blog.etiantian.org
http://oldboy.blog.51cto.com
http://10.0.0.7
解答:
#!/bin/bash . /etc/init.d/functions url=( http://blog.oldboyedu.com http://blog.etiantian.org http://oldboy.blog.51cto.com http://10.0.0.7 ) while true do for i in ${url[*]} do wget -q -o /dev/null --spider -T 5 --tries=1 $i if [ $? -eq 0 ] then action "$i" /bin/true else action "$i" /bin/false fi done sleep 10 done
说明:
wget -q -o /dev/null --spider -T 5 --tries=1 $i
-q 不显示输出信息;
-o 指定输出位置;
--spider 模拟抓取;
-T, timeout 设置超时时间;
–tries 增加重试次数;
20、单词及字母去重排序案例
用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.
课堂实战考察某企业shell面试考试题
http://oldboy.blog.51cto.com/2561410/1686891
解答:
1、按单词出现频率降序排序
tr "[,. ]" " " <oldboy.txt |grep -v "^$"|sort|uniq -c|sort -rn
2、按字母出现频率降序排序
tr "[,.]" " " <oldboy.txt |sed 's# ##g'|grep -o "w"|sort|uniq -c|sort -rn
说明:
grep -o 精确匹配
w 匹配一个字母
sort|uniq -c|sort -rn
sort 纵队
uniq-c 去重
sort -rn 倒序