试题一
写一个监控网卡的脚本,需要满足以下要求:
- 每10分钟检测一次指定网卡的流量。
#!/bin/bash
# yum install sysstat -y
[ -f /etc/profile ] && . /etc/profile
function network_check() {
interval=1
flag_count=2
network_eth=3
d_time=`date +'%Y-%m-%d %H:%M:%S'`
rx=`sar -n DEVinterval flag_count|grepnetwork_eth|egrep -v "^[0-9]"|awk '{print 5}'`
tx=`sar -n DEVinterval flag_count|grepnetwork_eth|egrep -v "^[0-9]"|awk '{print 6}'`
rx_kbps=`echo "rx * 8"|bc`
tx_kbps=`echo "tx * 8"|bc`
echo "d_time network_eth input:{rx_kbps}kbps output:${tx_kbps}kbps"
}
while true
do
network_check 1 5 ens192
sleep 5
done
试题二
写一个shell脚本,通过curl -I 返回的状态码来判定所访问的网站是否正常。 比如,当状态码为200时,才算正常。
#!/bin/bash
function web_check() {
web_url=1
web_code=`curl --connect-timeout 3 -I -sweb_url|sed -n '1p'`
if [ -z "web_code" ]; then
echo "网站访问失败,请确认域名是否正确"
return 5
fi
status_code=`echoweb_code|awk '{print 2}'`
if [status_code -eq 200 ]; then
echo "url:web_url status:status_code 请求成功"
else
echo "url:web_url status:status_code 请求失败"
fi
}
web_check www.qq.com
试题三
将用户家目录(考虑到执行脚本的用户可能是普通用户也可能是root)下面小于5KB的文件打包成tar.gz的压缩包,并以当前日期为文件名前缀,例如,2018-03-15.tar.gz。
#!/bin/bash
base_dir=`pwd`
user=`whoami`
d_time=`date +'%Y-%m-%d'`
if [ "user" == "root" ]; then
cd /root; find ./ -type f -size -5k |xargs tar -czvf /tmp/d_time.tar.gz
else
cd /home/user ; find ./ -type f -size -5k |xargs tar -czvf /tmp/d_time.tar.gz
fi
cd $base_dir
试题四
一个同学不小心用iptables规则把sshd端口22给封掉了,结果不能远程登陆,要想解决这问题,还要去机房,登录真机去删除这规则。 问题来了,要写个监控脚本,监控iptables规则是否封掉了22端口,如果封掉了,给打开。 写好脚本,放到任务计划里,每分钟执行一次。
#/bin/bash
function firewalld_check() {
firewall-cmd --list-all|grep 'services'|grep ssh &>/dev/null
if [ $? -eq 0 ]; then
echo "ssh端口正常"
else
echo "防火墙禁用ssh,开启中..."
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --reload
fi
}
while true
do
firewalld_check
sleep 10
done
#备注:未验证
试题五
已知nginx访问的日志文件在/usr/local/nginx/logs/access.log内,请统计下早上10点到12点 来访ip最多的是哪个?
#!/bin/bash
access_log=/data/logs/nginx/access_oms.log
y=`date +'%Y'`
ip_max=`sed -n "/\/y:10/,/\/y:12/"p access_log |awk '{print9}'|sort -r |uniq -c|head -1|awk '{print 2}'`
echoip_max
试题六
写一个shell脚本。提示输入一个暂停的数字,然后从1打印到该数字。然后询问是否继续。继续的话再输入一个数字接着打印,否则退出脚本。
例:如果输入的是5,打印1 2 3 4 5,然后继续输入15,然后打印6 7 …14 15 以此类推。
#!/bin/bash
flag=true
read -p '输入一个数字:' first_choose
for i in `seq 1 first_choose`
do
echoi
done
while flag
do
read -p '是否继续[y|n]:' choose
if [ "choose" == "N" -o "choose" == "n" ]; then
break fi
read -p '输入一个数字:' next_choose
for i in `seqfirst_choose next_choose`
do
echoi
done
done
试题七
在文本文档1.txt第5行(假设文件行数大于5)后面增加如下内容:
# cat a.sh |sed '5a# This is a test file.\n# Test insert line into this file.'
试题八
设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式”yymmdd_etc.tar.gz”,yy为年,mm为月,dd为日。
#!/bin/bash
d=`date +%d`
d_time=`date +%Y%m%d`
base_dir=`pwd`
[ ! -d /root/bak ] && mkdir -p /root/bak
if [ d -eq 01 ]; then
cd / ; tar -czf /root/bak/{d_time}_etc.tar.gz etc
cd $base_dir
fi
#备注:未经测试
试题九
需求是,把所有的成员平均分成若干个小组。这里,提供一个人员列表,比如成员有50人,需要分成7个小组,要求随机性,每次和每次分组的结果应该不一致。
#!/bin/bash
#这个脚本用来给人员分组
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-02
#人员列表文件
f=member.txt
#小组数
group_n=7
#人员总数
member_n=`wc -l f|awk '{print1}'`
#根据姓名计算该用户所在小组的id
get_n()
{
#根据姓名计算cksum值
l=`echo 1|cksum|awk '{print1}'`
#获取一个随机数
n1=RANDOM
#cksum值和随机数相加,然后除以小组数取余,这样可以确保每次获取到的余数都不一样
n2=[n1+l]
g_id=[n2%group_n]
#假如小组数为7,则余数范围0-6,如果余数为0,则小组为7
if [g_id -eq 0 ]
then
g_id=group_n
fi
echog_id
}
for i in `seq 1 group_n`
do
#n_i.txt为临时文件,用来记录该小组内的成员
#脚本之前执行过,则该文件会存在,本次执行脚本前应该删除掉这个临时文件
[ -f n_i.txt ] && rm -f n_i.txt
done
shuf f|while read name
do
#计算用户所在小组的id
g=`get_nname`
#将人员追加写入到他对应的小组里
echo name >> n_g.txt
done
#定义计算文件行数的函数
nu(){
wc -l 1|awk '{print1}'
}
#获取组员人数最多的小组
max(){
ma=0
for i in `seq 1 group_n|shuf`
do
n=`nu n_i.txt`
if [ n -gtma ]
then
ma=n
fi
done
echoma
}
#获取组员人数最少的小组
min(){
mi=member_n
for i in `seq 1group_n|shuf`
do
n=`nu n_i.txt`
if [n -lt mi ]
then
mi=n
fi
done
echo mi
}
#定义四舍五入函数
div()
{
n=`echo "scale=1;1/2"|bc`
n1=`echo "scale=1;n+0.5"|bc`
echo n1|cut -d. -f1
}
#小组组员平均值(非四舍五入)
ava_n=[member_n/group_n]
#小组组员平均值(四舍五入)
ava_n1=`div member_ngroup_n`
if [ ava_n -eqava_n1 ]
then
#定义初始最小值
ini_min=1
#以下while循环要做的事情,就是要把人数多的组里的人搞到人数少的组里去
#此while循环的条件是,当人数最少的组成员数小于组员平均值
while [ ini_min -ltava_n1 ]
do
#找出人数最多的组
m1=`max`
#找出人数最少的组
m2=`min`
for i in `seq 1 group_n|shuf`
do
n=`nu n_i.txt`
#找到人数最多的组对应的文件f1(可能有多个,这里取出现的第一个即可)
if [ n -eqm1 ]
then
f1=n_i.txt
#找到人数最少的组对应的文件f2(可能有多个,这里取出现的第一个即可)
elif [n -eq m2 ]
then
f2=n_i.txt
fi
done
#取f1中最后一个人名
name=`tail -n1 f1`
#将这个人名追加写入f2中
echoname >> f2
#在f1中删除刚刚取走的人名
sed -i "/name/d" f1
#把此时的最少组人员数赋值给ini_min
ini_min=`min`
done
else
#定义初始最大值
ini_max=member_n
while [ ini_max -gtava_n1 ]
do
#找出人数最多的组
m1=`max`
#找出人数最少的组
m2=`min`
for i in `seq 1 group_n|shuf`
do
n=`nu n_i.txt`
#找到人数最多的组对应的文件f1(可能有多个,这里取出现的第一个即可)
if [ n -eqm1 ]
then
f1=n_i.txt
#找到人数最少的组对应的文件f2(可能有多个,这里取出现的第一个即可)
elif [n -eq m2 ]
then
f2=n_i.txt
fi
done
#取f1中最后一个人名
name=`tail -n1 f1`
#将这个人名追加写入f2中
echoname >> f2
#在f1中删除刚刚取走的人名
sed -i "/name/d" f1
#把此时的最少组人员数赋值给ini_min
ini_max=`max`
done
fi
for i in `seq 1group_n`
do
echo -e "\033[34mi 组成员有:\033[0m"
cat n_i.txt
#把临时文件删除
rm -f n_$i.txt
echo
done
#备注:不会
试题十
写一个shell脚本,比较两个数的大小,支持浮点数,两个数通过shell参数的形式提供。
方法二
留言