第一题
题目:
请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如生成的文件名为2017-12-20.log, 并且把磁盘的使用情况写到到这个文件中,不用考虑cron,仅仅写脚本即可
答案:
第二题
题目:
统计nginx
访问日志每个IP访问量有多少
答案:
第三题
题目:
写一个脚本计算一下linux系统所有进程占用内存大小的和。
答案:
第四题
题目:
设计一个脚本,监控远程的一台机器(假设ip为180.163.26.39)的存活状态,当发现宕机时发一封邮件给你自己。
答案:
第五题
题目:
找到/123目录下所有后缀名为.txt的文件
- 批量修改.txt为.txt.bak
- 把所有.bak文件打包压缩为123.tar.gz
- 批量还原文件的名字,即把增加的.bak再删除
答案:
第六题
题目:
写一个脚本,判断本机的80端口(假如服务为httpd)是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s检测一次。
答案:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210522163405561.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDg5ODA2Mg==,size_16,color_FFFFFF,t_70
第七题
题目
设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。
假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30,
远程提供了一个rsync服务,备份的地址是 192.168.123.30::backup . 写完脚本后,需要加入到cron中,每天凌晨3点执行。
答案:
第八题
题目
服务器上跑的是LNMP环境,近期总是有502现象。502为网站访问的状态码,200正常,502错误是nginx最为普遍的错误状态码。由于502只是暂时的,并且只要一重启php-fpm服务则502消失,但不重启的话,则会一直持续很长时间。
所以有必要写一个监控脚本,监控访问日志的状态码,一旦发生502,则自动重启一下php-fpm。
我们设定:
1)access_log /data/log/access.log
2)脚本死循环,每10s检测一次(假设每10s钟的日志条数为300左右)
3)重启php-fpm的方法是 /etc/init.d/php-fpm restart
答案:
第九题
题目:
把一个文本文档的前5行中包含字母的行删除掉,同时把6到10行中的全部字母删除掉。
答案
第十题
题目:
用shell打印下面这句话中字母数小于6的单词。
Bash also interprets a number of multi-character options.
答案
第十一题
题目:
写一个脚本实现如下功能:
输入一个数字,然后运行对应的一个命令。
显示命令如下:
cmd meau* 1 - date 2 - ls 3 - who 4 - pwd当输入1时,会运行date, 输入2时运行ls, 以此类推。
答案
第十二题
题目:
用shell脚本实现如下需求:
添加user_00 – user_09 10个用户,并且给他们设置一个随机密码,密码要求10位包含大小写字母以及数字,注意需要把每个用户的密码记录到一个日志文件里。
答案
第十三题
题目:
在服务器上,写一个监控脚本,要求如下:
- 每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功?
- 若没有正常启动还需再一次启动,最大不成功数超过5次则需要立即发邮件通知管理员,并且以后不需要再检测!
- 如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件给管理员,然后自动退出该脚本。假设其中发邮件脚本为之前使用的mail.py
答案
第十四题
题目:
需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!并且每隔半小时把不再发起请求或者请求量很小的ip给解封。
假设:
- 一分钟内请求量高于100次的IP视为不正常请求。
- 访问日志路径为/data/logs/access_log。
答案
第十五题
题目:
请仔细查看如下几个数字的规律,并使用shell脚本输出后面的十个数字。
10 31 53 77 105 141 …….。
答案
第十六题
题目:
写个shell,看看你的Linux系统中是否有自定义用户(普通用户),若是有,一共有几个?
答案
第十七题
题目:
写一个shell脚本,检测所有磁盘分区使用率和inode使用率并记录到以当天日期为命名的日志文件里,当发现某个分区容量或者inode使用量大于85%时,发邮件通知你自己。
答案
第十八题
题目:
有一台服务器作为web应用,有一个目录(/data/web/attachment)不定时地会被用户上传新的文件,但是不知道什么时候会上传。所以,需要我们每5分钟做一次检测是否有新文件生成。
请写一个shell脚本去完成检测。检测完成后若是有新文件,还需要将新文件的列表输出到一个按年、月、日、时、分为名字的日志里。
答案
第十九题
题目:
写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10。
答案
第二十题
题目:
假如需要每小时都去执行一个脚本。在脚本中实现这样的功能,当时间是0点和12点时,需要将目录/data/log/下的文件全部清空,
注意只能清空文件内容而不能删除文件。而其他时间只需要统计一下每个文件的大小,一个文件一行,输出到一个按日期和时间为名字的日志里。
需要考虑/data/log/目录下的二级、三级、… 等子目录里面的文件。
答案
第二十一题
题目:
计算文档a.txt中每一行中出现的数字个数并且要计算一下整个文档中一共出现了几个数字。例如a.txt内容如下:
12aa*lkjskdj
alskdflkskdjflkjj
我们脚本名字为 ncount.sh, 运行它时:
bash ncount.sh a.txt
输出结果应该为:
2
0
sum:2
答案
第二十二题
题目:
有两台Linux服务器A和B,假如A可以直接ssh到B,不用输入密码。A和B都有一个目录叫做/data/web/ 这下面有很多文件,
当然我们不知道具体有几层子目录,假若之前A和B上该目录下的文件都是一模一样的。
但现在不确定是否一致了。固需要我们写一个脚本实现这样的功能,检测A机器和B机器/data/web/目录下文件的异同,我们以A机器上的文件作为标准。
比如,假若B机器少了一个a.txt文件,那我们应该能够检测出来,或者B机器上的b.txt文件有过改动,我们也应该能够检测出来(B机器上多了文件不用考虑)。
答案
第二十三题
题目:
写一个脚本,检测你的网络流量,并记录到一个日志里。需要按照如下格式,并且一分钟统计一次(只需要统计外网网卡,假设网卡名字为eth0):
2017-08-04 01:11
eth0 input: 1000bps
eth0 output : 200000bps
################
2017-08-04 01:12
eth0 input: 1000bps
eth0 output : 200000bps
提示:使用sar -n DEV 1 59 这样可以统计一分钟的平均网卡流量,只需要最后面的平均值。另外,注意换算一下,1Byte=8bit
答案:
第二十四题
题目:
一台机器负载高,top查看有很多sh的进程,然后top -c查看可以看到对应的进程命令是sh -c /bin/clearnen.sh 。
经分析后发现是因为该脚本执行时间太长,导致后续执行时,上次的脚本还未执行结束。写一个脚本批量杀死所有sh的进程。
答案:
第二十五题
题目:
写一个脚本判断你的Linux服务器里是否开启web服务?(监听80端口)如果开启了,请判断出跑的是什么服务,是httpd呢还是nginx又或者是其他的什么?
答案:
第二十六题
题目:
假设,当前MySQL服务的root密码为123456,写脚本检测MySQL服务是否正常(比如,可以正常进入mysql执行show processlist),并检测一下当前的MySQL服务是主还是从,如果是从,请判断它的主从服务是否异常。如果是主,则不需要做什么。
答案:
第二十七题
题目:
写一个支持选项的增加或删除用户的shell脚本,具体要求如下:
- 只支持三个选项:’–del’,’–add’,’–help’,输入其他选项报错。
- 使用’–add’时,需要验证用户名是否存在,存在则反馈存在,且不添加。 不存在则创建该用户,需要设置与该用户名相同的密码。
- 使用’–del’时,需要验证用户名是否存在,存在则删除用户及其家目录。不存在则反馈该用户不存在。
- –help选项反馈出使用方法。
- 能用echo $?检测脚本执行情况,成功删除或添加用户为0,不成功为非0正整数。
- 能以英文逗号分割,一次性添加或者删除多个用户。例如 adddel.sh --add user1,user2,user3
答案:
第二十八题
题目:
写一个脚本: 计算100以内所有能被3整除的正整数的和
答案:
第二十九题
题目:
使用传参的方法写个脚本,实现加减乘除的功能。
例如: sh a.sh 1 2,这样会分别计算加、减、乘、除的结果。
要求:
- 脚本需判断提供的两个数字必须为整数
- 当做减法或者除法时,需要判断哪个数字大,减法时需要用大的数字减小的数字,除法时需要用大的数字除以小的数字,并且结果需要保留两个小数点。
答案:
第三十题
题目:
写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。
答案:
第三十一题
题目:
提示用户输入网卡的名字,然后我们用脚本输出网卡的ip,需要考虑下面问题:
- 输入的字符不符合网卡名字规范,怎么应对。
- 名字符合规范,但是根本就没有这个网卡又怎么应对。
答案:
第三十二题
题目:
写一个脚本,实现如下功能:
- 脚本可以带参数也可以不带
- 参数可以有多个,每个参数必须是一个目录
- 脚本检查参数个数,若等于0,则列出当前目录本身,否则显示每个参数包含的子目录。
答案:
第三十三题
题目:
定义一个shell函数,能接受两个参数,满足以下要求:
- 第一个参数为URL,即可下载的文件,第二个参数为目录,即下载后保存的位置
- 如果用户给的目录不存在,则提示用户是否创建,如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本
- 如果给的目录存在,则下载文件,下载命令执行结束后测试文件下载成功与否,如果成功,则返回0给调用脚本,否则,返回52给调用脚本
答案:
第三十四题
题目:
写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小。
答案:
第三十五题
题目:
写一个shell脚本,能实现如下需求:
- 执行脚本后,提示输入名字(英文的,可以是大小写字母、数字不能有其他特殊符号),然后输出一个随机的0-99之间的数字,脚本并不会退出,继续提示让输入名字
- 如果输入相同的名字,输出的数字还是第一次输入该名字时输出的结果
- 前面已经输出过的数字,下次不能再出现
- 当输入q或者Q时,脚本会退出。
答案:
第三十六题
题目:
用shell实现,把一个文本文档中只有一个数字的行给打印出来。
答案:
第三十七题
题目:
系统logrotate工具,可以完成日志切割、归档。写一个shell脚本实现类似的归档功能。
举例: 假如服务的输出日志是1.log,要求每天归档一个,1.log第二天就变成1.log.1,第三天1.log.2, 第四天 1.log.3 一直到1.log.5。
答案:
第三十八题
题目:
写一个shell脚本,把192.168.0.0/24网段在线的ip列出来。
答案:
第三十九题
题目:
写一个shell脚本,检查指定的shell脚本是否有语法错误,若有错误,首先显示错误信息,然后提示用户输入q或者Q退出脚本,输入其他内容则直接用vim打开该shell脚本。
答案:
第四十题
题目:
输入一串随机数字,然后按千分位输出。
比如输入数字串为“123456789”,输出为123,456,789。
答案:
第四十一题
题目:
写一个shell脚本,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘选择执行对应的命令。
答案:
第四十二题
题目:
写一个shell脚本,执行中每隔5分钟检查指定的用户是否登录系统,用户名从命令行输入,如果指定的用户已经登录,则显示相关信息。
答案:
第四十三题
题目:
设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式"yymmdd_etc.tar.gz",yy为年,mm为月,dd为日。
答案:
第四十四题
写一个shell脚本,比较两个数的大小,支持浮点数,两个数通过shell参数的形式提供。
if [ $# -ne 2 ]
then
echo “请提供两个参数.”
exit
fi
if_number()
{
if echo $1|grep -q ‘^-’
then
nu=echo $1|sed 's/^-//'
else
nu=$1
fi
n=echo $nu|sed 's/[0-9.]//g'
if [ -n “$n” ]
then
echo “$1不是合法数字.”
exit
fi
if echo $1|grep -q ‘^.’
then
echo “$1不是合法数字.”
exit
fi
}
if_number $1
if_number $2
n1=echo "$1>$2"|bc
if [ $n1 -eq 1 ]
then
echo “$1 > $2”
else
if [ “$1” == “$2” ]
then
echo “$1 = $2”
else
echo “$1 < $2”
fi
fi
第四十五
需求是,把所有的成员平均分成若干个小组。这里,提供一个人员列表,比如成员有50人,需要分成7个小组,要求随机性,每次和每次分组的结果应该不一致。
参考人员名单
xiaoguisheng
guoyuqing
xiongyongzheng
mengjintang
chaizuzhou
zhousheng
xufangming
zhaoliangyun
hanshiru
wangxianyi
zhangjipei
luxiuli
yangshugen
guoyongzhi
lijianguo
wuqiongchen
dinglin
yaoyashan
yinzijia
wangbencheng
liuxiuwen
chenzuqi
leyuguo
baozongyao
fenghao
sunxiaoquan
zhangyaxian
lijiuzhe
dulichun
lixi
shenpeiwen
zousilin
luoping
chaiyan
fandaozhang
huzixiang
jinzhen
zhujunfeng
liqianbiao
hangyanliang
luorenjian
loujianji
fujianzhou
gengyiwu
jinjigui
liuzhizhong
lisanyan
lisili
zhangyiyu
songguozhen
zhangxinghua
zhaozhiyong
huanghe
xiaojie
fanhongfei
wangguiwen
renshumin
songfuying
zhanghaibo
liguangqun
puaihua
yanzhihua
gaojixian
liulai
funing
chenruizhi
chendaxin
laishaoying
xujian
xiaozhekou
xuxiaping
jiangchunqing
#人员列表文件
f=member.txt
#小组数
group_n=7
#人员总数
member_n=wc -l $f|awk '{print $1}'
#根据姓名计算该用户所在小组的id
get_n()
{
#根据姓名计算cksum值
l=echo $1|cksum|awk '{print $1}'
#获取一个随机数
n1=KaTeX parse error: Expected 'EOF', got '#' at position 12: RANDOM #̲cksum值和随机数相加,然后…[
n
1
+
n1+
n1+l]
g_id=
[
[
[n2%$group_n]
#假如小组数为7,则余数范围0-6,如果余数为0,则小组为7
if [
g
i
d
−
e
q
0
]
t
h
e
n
g
i
d
=
g_id -eq 0 ] then g_id=
gid−eq0]thengid=group_n
fi
echo $g_id
}
for i in seq 1 $group_n
do
#n_KaTeX parse error: Expected 'EOF', got '#' at position 28: …来记录该小组内的成员 #̲脚本之前执行过,则该文件会存在…i.txt ] && rm -f n_$i.txt
done
shuf $f|while read name
do
#计算用户所在小组的id
g=get_n $name
#将人员追加写入到他对应的小组里
echo KaTeX parse error: Expected group after '_' at position 10: name >> n_̲g.txt
done
#定义计算文件行数的函数
nu(){
wc -l $1|awk ‘{print $1}’
}
#获取组员人数最多的小组
max(){
ma=0
for i in seq 1 $group_n|shuf
do
n=nu n_$i.txt
if [ $n -gt
m
a
]
t
h
e
n
m
a
=
ma ] then ma=
ma]thenma=n
fi
done
echo $ma
}
#获取组员人数最少的小组
min(){
mi=$member_n
for i in seq 1 $group_n|shuf
do
n=nu n_$i.txt
if [ $n -lt
m
i
]
t
h
e
n
m
i
=
mi ] then mi=
mi]thenmi=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_n $group_n
if [ $ava_n -eq $ava_n1 ]
then
#定义初始最小值
ini_min=1
#以下while循环要做的事情,就是要把人数多的组里的人搞到人数少的组里去
#此while循环的条件是,当人数最少的组成员数小于组员平均值
while [ $ini_min -lt $ava_n1 ]
do
#找出人数最多的组
m1=max
#找出人数最少的组
m2=min
for i in seq 1 $group_n|shuf
do
n=nu n_$i.txt
#找到人数最多的组对应的文件f1(可能有多个,这里取出现的第一个即可)
if [ $n -eq KaTeX parse error: Expected group after '_' at position 43: … f1=n_̲i.txt
#找到人数最少的组对应的文件f2(可能有多个,这里取出现的第一个即可)
elif [ $n -eq KaTeX parse error: Expected group after '_' at position 43: … f2=n_̲i.txt
fi
done
#取f1中最后一个人名
name=tail -n1 $f1
#将这个人名追加写入f2中
echo $name >> KaTeX parse error: Expected 'EOF', got '#' at position 12: f2 #̲在f1中删除刚刚取走的人名 …name/d" KaTeX parse error: Expected 'EOF', got '#' at position 12: f1 #̲把此时的最少组人员数赋值给in…member_n
while [ $ini_max -gt $ava_n1 ]
do
#找出人数最多的组
m1=max
#找出人数最少的组
m2=min
for i in seq 1 $group_n|shuf
do
n=nu n_$i.txt
#找到人数最多的组对应的文件f1(可能有多个,这里取出现的第一个即可)
if [ $n -eq KaTeX parse error: Expected group after '_' at position 43: … f1=n_̲i.txt
#找到人数最少的组对应的文件f2(可能有多个,这里取出现的第一个即可)
elif [ $n -eq KaTeX parse error: Expected group after '_' at position 43: … f2=n_̲i.txt
fi
done
#取f1中最后一个人名
name=tail -n1 $f1
#将这个人名追加写入f2中
echo $name >> KaTeX parse error: Expected 'EOF', got '#' at position 12: f2 #̲在f1中删除刚刚取走的人名 …name/d" $f1
#把此时的最少组人员数赋值给ini_min
ini_max=max
done
fi
for i in seq 1 $group_n
do
echo -e "\033[34mKaTeX parse error: Undefined control sequence: \0 at position 8: i 组成员有:\̲0̲33[0m" cat …i.txt
#把临时文件删除
rm -f n_$i.txt
echo
done
第四十六
将文件内所有的单词的重复次数计算出来,只需要列出重复次数最多的10个单词。
参考答案
for w in sed 's/[^a-zA-Z]/ /g' $1
do
echo $w
done |sort |uniq -c |sort -nr|head
第四十七
设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式"yymmdd_etc.tar.gz",yy为年,mm为月,dd为日。
参考答案
d1=date +%d
d2=date +%y%m%d
if [
d
1
=
=
"
01
"
]
t
h
e
n
c
d
/
e
t
c
/
t
a
r
c
z
f
/
r
o
o
t
/
b
a
k
/
d1 == "01" ] then cd /etc/ tar czf /root/bak/
d1=="01"]thencd/etc/tarczf/root/bak/d2_etc.tar.gz ./
fi
第四十八
在文本文档1.txt第5行(假设文件行数大于5)后面增加如下内容:
# This is a test file.
# Test insert line into this file.
参考答案
n=0
cat 1.txt |while read line
do
n=
[
[
[n+1]
if [ $n -eq 5 ]
then
echo $line
echo -e “# This is a test file.\n# Test insert line into this file.”
else
echo $line
fi
done
第四十九
写一个shell脚本。提示输入一个暂停的数字,然后从1打印到该数字。然后询问是否继续。继续的话再输入一个数字接着打印,否则退出脚本。
例:如果输入的是5,打印1 2 3 4 5,然后继续输入15,然后打印6 7 …14 15 以此类推。
参考答案
``
read -p "Please input a number: " n
n1=echo $n |sed 's/[0-9]//g'
if [ -n “$n1” ]
then
echo “Please input a number.”
exit
fi
for i in seq 1 $n
do
echo $i
done
read -p “If continue? y/n” c
case $c in
n|N)
exit
;;
y|Y)
read -p “Please input a number: " n2
n3=echo $n2|sed 's/[0-9]//g'
if [ -n “$n3” ]
then
echo “Please input a number.”
exit
fi
if [ $n2 -le
n
]
t
h
e
n
e
c
h
o
"
n ] then echo "
n]thenecho"n2 should grater than $n.”
exit
fi
for i in seq $[$n+1] $n2
do
echo $i
done
;;
*)
echo “Please input y or n.”
;;
esac
第五十
已知nginx访问的日志文件在/usr/local/nginx/logs/access.log内,请统计下早上10点到12点 来访ip最多的是哪个?
参考日志
111.199.186.68 – [15/Sep/2017:09:58:37 +0800] “//plugin.php?id=security:job” 200 “POST //plugin.php?id=security:job HTTP/1.1″”http://a.lishiming.net/forum.php?mod=viewthread&tid=11338&extra=page%3D1%26filter%3Dauthor%26orderby%3Ddateline” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36”
203.208.60.208 – [15/Sep/2017:09:58:46 +0800] “/misc.php?mod=patch&action=ipnotice&_r=0.05560809863330207&inajax=1&ajaxtarget=ip_notice” 200 “GET /misc.php?mod=patch&action=ipnotice&_r=0.05560809863330207&inajax=1&ajaxtarget=ip_notice HTTP/1.1″”http://a.lishiming.net/forum.php?mod=forumdisplay&fid=65&filter=author&orderby=dateline” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3141.7 Safari/537.36”
参考答案
export LANG=en
log="/usr/local/nginx/logs/access.log"
t=date +%d/%b/%Y:1[01]:[0-5][0-9]:
egrep “$t” $log|awk ‘{print $1}’ |sort -n |uniq -c |sort -n |tail -1 |awk ‘{print $2}’