2021-05-23

本文提供了一系列的Shell脚本编程题目,涵盖了服务器管理、日志分析、进程监控、网络流量检测、文件操作等多个方面,旨在提升Linux系统的自动化任务处理能力。这些题目包括但不限于生成日志文件、统计Nginx访问、计算内存占用、监测远程服务器状态、文件重命名及压缩、端口监控、数据库备份、网络流量统计、用户管理、脚本选项处理、负载均衡检测等。解答这些题目有助于掌握Shell脚本在实际运维中的应用。
摘要由CSDN通过智能技术生成

第一题

题目:
请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,例如生成的文件名为2017-12-20.log, 并且把磁盘的使用情况写到到这个文件中,不用考虑cron,仅仅写脚本即可

答案:
在这里插入图片描述

第二题

题目:
统计nginx访问日志每个IP访问量有多少

答案:
在这里插入图片描述

第三题

题目:
写一个脚本计算一下linux系统所有进程占用内存大小的和。

答案:
在这里插入图片描述

第四题

题目:
设计一个脚本,监控远程的一台机器(假设ip为180.163.26.39)的存活状态,当发现宕机时发一封邮件给你自己。

答案:
在这里插入图片描述
在这里插入图片描述

第五题

题目:
找到/123目录下所有后缀名为.txt的文件

  1. 批量修改.txt为.txt.bak
  2. 把所有.bak文件打包压缩为123.tar.gz
  3. 批量还原文件的名字,即把增加的.bak再删除

答案:
在这里插入图片描述

第六题

题目:
写一个脚本,判断本机的80端口(假如服务为httpd)是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下httpd服务,并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s检测一次。

答案:
在这里插入图片描述

第七题

题目
设计一个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位包含大小写字母以及数字,注意需要把每个用户的密码记录到一个日志文件里。

答案
在这里插入图片描述

第十三题

题目:
在服务器上,写一个监控脚本,要求如下:

  1. 每隔10s去检测一次服务器上的httpd进程数,如果大于等于500的时候,就需要自动重启一下apache服务,并检测启动是否成功?
  2. 若没有正常启动还需再一次启动,最大不成功数超过5次则需要立即发邮件通知管理员,并且以后不需要再检测!
  3. 如果启动成功后,1分钟后再次检测httpd进程数,若正常则重复之前操作(每隔10s检测一次),若还是大于等于500,那放弃重启并需要发邮件给管理员,然后自动退出该脚本。假设其中发邮件脚本为之前使用的mail.py

答案
在这里插入图片描述在这里插入图片描述

第十四题

题目:
需求: 根据web服务器上的访问日志,把一些请求量非常高的ip给拒绝掉!并且每隔半小时把不再发起请求或者请求量很小的ip给解封。
假设:

  1. 一分钟内请求量高于100次的IP视为不正常请求。
  2. 访问日志路径为/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脚本,具体要求如下:

  1. 只支持三个选项:’–del’,’–add’,’–help’,输入其他选项报错。
  2. 使用’–add’时,需要验证用户名是否存在,存在则反馈存在,且不添加。 不存在则创建该用户,需要设置与该用户名相同的密码。
  3. 使用’–del’时,需要验证用户名是否存在,存在则删除用户及其家目录。不存在则反馈该用户不存在。
  4. –help选项反馈出使用方法。
  5. 能用echo $?检测脚本执行情况,成功删除或添加用户为0,不成功为非0正整数。
  6. 能以英文逗号分割,一次性添加或者删除多个用户。例如 adddel.sh --add user1,user2,user3

答案:
在这里插入图片描述

第二十八题

题目:
写一个脚本: 计算100以内所有能被3整除的正整数的和

答案:
在这里插入图片描述

第二十九题

题目:
使用传参的方法写个脚本,实现加减乘除的功能。
例如: sh a.sh 1 2,这样会分别计算加、减、乘、除的结果。
要求:

  1. 脚本需判断提供的两个数字必须为整数
  2. 当做减法或者除法时,需要判断哪个数字大,减法时需要用大的数字减小的数字,除法时需要用大的数字除以小的数字,并且结果需要保留两个小数点。

答案:
在这里插入图片描述

第三十题

题目:
写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。

答案:
在这里插入图片描述

第三十一题

题目:
提示用户输入网卡的名字,然后我们用脚本输出网卡的ip,需要考虑下面问题:

  1. 输入的字符不符合网卡名字规范,怎么应对。
  2. 名字符合规范,但是根本就没有这个网卡又怎么应对。

答案:
在这里插入图片描述

第三十二题

题目:
写一个脚本,实现如下功能:

  1. 脚本可以带参数也可以不带
  2. 参数可以有多个,每个参数必须是一个目录
  3. 脚本检查参数个数,若等于0,则列出当前目录本身,否则显示每个参数包含的子目录。

答案:
在这里插入图片描述

第三十三题

题目:
定义一个shell函数,能接受两个参数,满足以下要求:

  1. 第一个参数为URL,即可下载的文件,第二个参数为目录,即下载后保存的位置
  2. 如果用户给的目录不存在,则提示用户是否创建,如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本
  3. 如果给的目录存在,则下载文件,下载命令执行结束后测试文件下载成功与否,如果成功,则返回0给调用脚本,否则,返回52给调用脚本

答案:
在这里插入图片描述

第三十四题

题目:
写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小。

答案:
在这里插入图片描述

第三十五题

题目:
写一个shell脚本,能实现如下需求:

  1. 执行脚本后,提示输入名字(英文的,可以是大小写字母、数字不能有其他特殊符号),然后输出一个随机的0-99之间的数字,脚本并不会退出,继续提示让输入名字
  2. 如果输入相同的名字,输出的数字还是第一次输入该名字时输出的结果
  3. 前面已经输出过的数字,下次不能再出现
  4. 当输入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为日。

答案:
在这里插入图片描述

第四十四题

题目:
在文本文档1.txt第5行(假设文件行数大于5)后面增加如下内容:
# This is a test file.# Test insert line into this file.

答案:
在这里插入图片描述

第四十五题

写一个shell,先判断是否安装httpd和mysql,没有安装进行安装,安装了检查是否启动服务,若没有启动则需要启动服务。

参考答案

#!/bin/bash
if_install()
{
    rpm -q $1 >/dev/null 2>/dev/null 
    if [ $? -eq 0 ]
    then
	echo "$1已经安装"
	return 0
    else
	echo "$1没有安装"
	return 1
    fi
}

if_install httpd
if [ $? -eq 0 ]
then
    if ! pgrep httpd >/dev/null 
    then
	service httpd start
    fi
else
    yum install -y httpd
fi

if_install mysql-server
if [ $? -eq 0 ]
then
    if ! pgrep mysqld >/dev/null
    then
       service mysqld start
    fi
else
    yum install -y mysql-server
fi

第四十六题

用shell脚本判断输入的日期是否合法。

比如20170110就是合法日期,20171332就不合法。

参考答案

#!/bin/bash
if [ $# -ne 1 ] || [ ${#1} -ne 8 ]
then
    echo "请输入正确的格式,sh $0 yyyymmdd"
    exit 1
fi

y=`echo ${1:0:4}`
m=`echo ${1:4:2}`
d=`echo ${1:6:2}`

if echo $d|grep -q "^0" 
then
    d=`echo ${1:6:2}|sed 's/^0//'`
fi

if cal $m $y >/dev/null 2>/dev/null
then
    if ! cal $m $y|grep -qw "$d"
    then
	echo "你给的日期是不合法的"
    else
	echo "日期合法"
    fi
else
    echo "你给的日期不合法"
fi

第四十七题

写一个监控网卡的脚本,需要满足以下要求:

  1. 每10分钟检测一次指定网卡的流量。

  2. 如果流量为0,则重启网卡。

参考答案

#!/bin/bash
LANG=en
sar -n DEV 1 10|grep -w "$1" > /tmp/sar.tmp
in=`grep "Average:" /tmp/sar.tmp|awk '{print $5}'|sed 's/\.//'`
out=`grep "Average:" /tmp/sar.tmp|awk '{print $6}'|sed 's/\.//'`

if [ $in == "000" ] && [ $out == "000" ]
then
    ifdown $1
    ifup $1
fi

第四十八题

写一个shell脚本,通过curl -I 返回的状态码来判定所访问的网站是否正常。
比如,当状态码为200时,才算正常。

参考答案



url="http://www.apelearn.com/index.php"
mail_user=306798658@qq.com

code=`curl -I $url 2>/tmp/curl.err|head -1|awk '{print $2}'`
if [ -z "$code" ]
then
    python mail.py $mail_user "$url访问异常" "`cat /tmp/curl.err`"
    exit
elif [ $code != "200" ]
then
    curl -I $url &> /tmp/curl.log
    python mail.py $mail_user "$url访问异常 状态码$code" "`/tmp/curl.log`" 
fi

第四十九题

想办法把文本里面每三行内容合并到一行
例如:1.txt内容

1
2
3
4
5
6
7

处理后应该是

1 2 3
4 5 6
7

参考答案

#!/bin/bash
n=1
cat $1 |while read line 
do
    n1=$[$n%3]
    if [ $n1 -eq 0 ]
    then
	echo "$line"
    else
	echo -n "$line " 
    fi
    n=$[$n+1]
done

第五十题

写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务:

1)使用格式:getinterface.sh [-i interface | -I ip]

2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项时,显示其指定ip所属的网卡。

例:
sh getinterface.sh -i eth0 或者

sh getinterface.sh -I 192.168.0.1

3)当用户使用除[-i | -I]选项时,显示[-i interface | -I ip]此信息。

4)当用户指定信息不符合时,显示错误。(比如指定的eth0没有,而是eth1时)

参考答案

#!/bin/bash
ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}' > /tmp/ifs.txt
get_ip()
{
    ip add show dev $1 |grep inet |awk '{print $2}' |awk -F '/' '{print $1}'
}

for eth in `cat /tmp/ifs.txt`
do
    myip=`get_ip $eth`
    if [ -z "$myip" ]
    then
	echo $eth 
    else
	echo $eth $myip 
    fi
done > /tmp/if_ip.txt 

if [ $# -ne 2 ]
then
    echo "请输入正确的格式: bash $0 -i 网卡 或者 bash $0 -I ip"
    exit
fi

if [ $1 == "-i" ]
then
    if awk '{print $1}' /tmp/if_ip.txt |grep -qw $2
    then
	eth=$2
	ip1=`awk -v aeth=$eth '$1==aeth' /tmp/if_ip.txt|sed "s/$eth //"`
        echo "网卡$2的ip是 $ip1"
    else
	echo "你指定的网卡不对,系统中的网卡有:`cat /tmp/ifs.txt|xargs`"
	exit
    fi
elif [ $1 == "-I" ]
then
    if grep -qw " $2 "  /tmp/if_ip.txt
    then
	eth=`grep -w " $2 " /tmp/if_ip.txt|awk '{print $1}'`
        echo "IP $2对应的网卡是$eth"
    else
	echo "你指定的ip不对,系统中的IP有:`ip add |grep inet |awk '{print $2}'|awk -F '/' '{print $1}'|xargs`"
	exit
    fi
else
    echo "请输入正确的格式: bash $0 -i 网卡 或者 bash $0 -I ip"
fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值