试题十一
写一个脚本实现如下功能: 输入一个数字,然后运行对应的一个命令。
显示命令如下:
*cmd meau** 1 – date 2 – ls 3 – who 4 – pwd 当输入1时,会运行date, 输入2时运行ls, 以此类推。
核心要点:
- case判断
#!/bin/bash
red='\e[91m'
green='\e[92m'
yellow='\e[93m'
magenta='\e[95m'
cyan='\e[96m'
none='\e[0m'
function meau() {
shell_cwd=1shell_cwd
}
while true
do
echo -e "yellow 1.none执行date命令"
echo
echo -e "yellow 2.none执行ls命令"
echo
echo -e "yellow 3.none执行who命令"
echo
echo -e "yellow 4.none执行pwd命令"
echo
echo -e "yellow q.none执行exit命令"
echo
read -p "(echo -e "请选择菜单 [{magenta}1-4none]:")" choose
if [ -zchoose ]; then
exit 1
else
case $choose in
1)
meau date
;;
2)
meau ls
;;
3)
meau who
;;
4)
meau pwd
;;
q|Q)
exit 4
;;
*)
echo "USAGE:{1|2|3|4|q}"
;;
esac
fi
done
试题十二
用shell脚本实现如下需求:
添加user_00 – user_09 10个用户,并且给他们设置一个随机密码,密码要求10位包含大小写字母以及数字,注意需要把每个用户的密码记录到一个日志文件里。 提示:
1.随机密码使用命令mkpasswd
2.在脚本中给用户设置密码,可以使用echo然后管道passwd命令
核心要点:
- seq实现数字递增
- RANDOM创建随机密码
#!/bin/bash
[ -f /etc/profile ] && . /etc/profile
PASSWORD_LOG=/tmp/pass.txt
[ ! -f PASSWORD_LOG ] && touchPASSWORD_LOG
function user_add() {
user_wc=1
n=`echo "user_wc"|wc -L`
if [ "user_wc" == "0" -a "n" == "1" ]; then
user_wc=00
elif [ "user_wc" != "0" -a "n" == "1" ]; then
user_wc=0{user_wc}
fi
for i in `seq -w 00user_wc`
do
id user_i &>/dev/null
if [? -eq 0 ]; then
echo "user_i已存在"
else
pass=`echoRANDOM|md5sum |cut -c 1-10`
useradd user_i
echo "pass"|passwd --stdin user_i
if [? -eq 0 ]; then
echo "用户名:user_i">>PASSWORD_LOG
echo "密码:pass" >>PASSWORD_LOG
echo "">> $PASSWORD_LOG
fi
fi
done
}
user_add 11
试题十三
在服务器上,写一个监控脚本,要求如下:
- 每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功?
- 若没有正常启动还需再一次启动,最大不成功数超过5次则需要立即发邮件通知管理员,并且以后不需要再检测!
- 如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件给管理员,然后自动退出该脚本。假设其中发邮件脚本为之前使用的mail.py
核心要点:
- 检测进程命令ps -C httpd –no-heading
sum_chek=`ps -C httpd --no-heading|wc -l`;if [ $sum_chek -gt 100 ]; then echo 'gt 100'; else echo 'lt 100'; fi
#备注:这种进程进程数脚本没必要写
试题十四
需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!并且每隔半小时把不再发起请求或者请求量很小的ip给解封。 假设:
- 一分钟内请求量高于100次的IP视为不正常请求。
- 访问日志路径为/data/logs/access_log。
用第2例中的1.log作为演示日志
112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com “/seccode.php?update=0.5593110133088248″ 200 ″http://formula-x.haotui.com/registerbbs.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)”
61.147.76.51 – [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com “/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71″ 301 ″http://xyzdiy.5d6d.com/thread-1435-1-23.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”
核心要点:
- awk、cut等命令使用
- firewalld理解
#!/bin/bash
[ -f /etc/profile ] && . /etc/profile
FIREWALLD_LOG=/tmp/firewall.log
FIREWALLD_BAD_LOG=/tmp/firewall_bad.log
FIREWALLD_ERROR_LOG=/tmp/firewall_error.log
CHECK_LOG=1.log
last_min=`date -d '-1 min' +%Y:%H:%M`
HTTP_PORT=80
[ ! -f FIREWALLD_LOG ] && touchFIREWALLD_LOG
[ ! -f FIREWALLD_BAD_LOG ] && touchFIREWALLD_BAD_LOG
[ ! -f FIREWALLD_ERROR_LOG ] && touchFIREWALLD_ERROR_LOG
function firewall_reject() {
server_port=1
host_ip=2
d_time=`date +'%Y-%m-%d %H:%M:%S'`
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="host_ip" port protocol="tcp" port="server_port" reject" &>/dev/null
if [ ? -eq 0 ]; then
echo "d_time REGECT server:host_ip server_port:server_port success" >> FIREWALLD_LOG
echo "d_time host_ipserver_port" >> FIREWALLD_BAD_LOG
else
echo "d_time REGECT server:host_ip server_port:server_port faild" >> FIREWALLD_LOG
fi
firewall-cmd --reload
}
function firewall_allow() {
server_port=`echo@|awk '{print 4}'`
host_ip=`echo@|awk '{print 3}'`
old_time=`echo@|cut -d " " -f 1,2`
d_time=`date +'%Y-%m-%d %H:%M:%S'`
d_time_stamp=`date -d "d_time" +%s`
old_time_stamp=`date -d "old_time" +%s`
statistics_time=[d_time_stamp-old_time_stamp]
server_port=`grep "host_ip" FIREWALLD_BAD_LOG|awk '{print4}'`
if [ statistics_time -gt 3600 ]; then
firewall-cmd --permanent --zone=public --remove-rich-rule='rule port port="server_port" protocol="tcp" family="ipv4" source address="host_ip" reject' &>/dev/null
if [? -eq 0 ]; then
echo "d_time ALLOW reject server:host_ip server_port:server_port success" >>FIREWALLD_LOG
else
echo "d_time ALLOW reject server:host_ip server_port:server_port faild" >>FIREWALLD_LOG
fi
fi
firewall-cmd --reload
}
egrep "last_min:[0-9]+"CHECK_LOG |awk '{print 1}'|sort |uniq -c|awk '1>100{print 2}'|while read line
do grepline FIREWALLD_BAD_LOG &>/dev/null
if [? -ne 0 ]; then
firewall_reject HTTP_PORTline
fi
done
#默认一小时解封
cat FIREWALLD_BAD_LOG |while read i
do
echo ">>>i"
firewall_allow $i
done
备注:firewall检测状态存在难度,这里默认改成1小时候进行解封,没细策,可能存在bug。另外关于access日志每天需要做切割
试题十五
请仔细查看如下几个数字的规律,并使用shell脚本输出后面的十个数字。
10 31 53 77 105 141 …….
核心要点:
- 计算两个数值之间的差值
#!/bin/bash
x=10
y=21
for i in `seq 0 15`
do
echo x
x=[x+y]
z=[2**i]
y=[y+$z]
done
试题十六
写个shell,看看你的Linux系统中是否有自定义用户(普通用户),若是有,一共有几个?
核心要点
- grep、cut、awk使用
cat /etc/passwd|while read line; do user=`echo line|awk -F ':' '3>1000{print 1}'`; if [ -n "user" ]; then echo user;sum_count=[sum_count+1]; echosum_count ;fi; done
试题十七
写一个shell脚本,检测所有磁盘分区使用率和inode使用率并记录到以当天日期为命名的日志文件里,当发现某个分区容量或者inode使用量大于85%时,发邮件通知你自己。
核心要点:
- df使用
- awk使用
df -i |egrep "/dev/sd[a-z][0-9]+"|awk -F "%" '{print 1}'|awk 'NF>85{print 1}'|while read line; do d_time=`date +'%Y-%m-%d %H:%M:%S'`; echo "d_time $line warning"; done
试题十八
有一台服务器作为web应用,有一个目录(/data/web/attachment)不定时地会被用户上传新的文件,但是不知道什么时候会上传。所以,需要我们每5分钟做一次检测是否有新文件生成。
请写一个shell脚本去完成检测。检测完成后若是有新文件,还需要将新文件的列表输出到一个按年、月、日、时、分为名字的日志里。
核心要点:
- find使用
#!/bin/bash
basedir=/data/web/attachment
d_time=`date -d '5 min ago' +'%Y%m%d%H%M'`
[ ! -d basedir ] && exit 6
findbasedir -type f -mmin -5 > /tmp/file.list
nnc=`wc -l /tmp/file.list|awk '{print 1}'`
if [nnc -gt 0 ]; then
mv /tmp/file.list /tmp/$d_time.list
fi
试题十九
写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10。
核心要点:
- awk等命令使用
history |awk '{print $2}'|sort |uniq -c|sort -n -k 1 -r|head -10
试题二十
假如需要每小时都去执行一个脚本。在脚本中实现这样的功能,当时间是0点和12点时,需要将目录/data/log/下的文件全部清空,
注意只能清空文件内容而不能删除文件。而其他时间只需要统计一下每个文件的大小,一个文件一行,输出到一个按日期和时间为名字的日志里。
需要考虑/data/log/目录下的二级、三级、… 等子目录里面的文件。
留言