试题一
有两个文件a.txt和b.txt,需求是,把a.txt中有的但b.txt中没有的行找出来,并写入到c.txt,然后计算c.txt文件的行数。
#!/bin/bash
while read line
do
egrep "^${line}$" b.txt &>/dev/null
if [ $? -ne 0 ]; then
echo "$line" >> /tmp/c.txt
fi
done
试题二
把当前用户下所有进程名字中含有"aming"的进程关闭。
ps -ef|grep docker|egrep -v "grep"|awk '{print "kill "$2}'|bash
试题三
用shell实现,以并发进程的形式将mysql数据库所有的表备份到当前目录,并把所有的表压缩到一个压缩包文件里。
假设数据库名字为mydb,用户名为aming,密码为passwd。
#!/bin/bash
#功能:数据库备份
#yousong.xiang
#v1.0.2
. /etc/profile
#数据库用户名
##GRANT SELECT, RELOAD, SUPER, LOCK TABLES ON *.* TO 'mysqldumper'@'localhost' identified by 're8Z3db57dltINJdWF5e&2fMu';
##flush privileges ;
dbuser='mysqldumper'
#数据库用密码
dbpasswd='123456'
#备份时间
backtime=`date '+%Y%m%d%H%M%S'`
t_time=`date '+%Y-%m-%d %H:%M:%S'`
#日志备份路径
logpath='/data/mysqlbakup'
#数据备份路径
datapath='/data/mysqlbakup'
if [ ! -d ${datapath} ];then
mkdir ${datapath} -p
fi
#日志记录头部
echo "备份时间为${t_time},备份数据库表 ${dbname} 开始" >> ${logpath}/log.log
#获取数据库名
dbname=`mysql -u${dbuser} -p${dbpasswd} -e "show databases;" |egrep -v "Database|sys|information_schema|mysql|performance_schema"`
#正式备份数据库
for db in $dbname; do
#source=`mysqldump -u ${dbuser} -p${dbpasswd} ${db}> ${logpath}/${db}${backtime}.sql` 2>> ${logpath}/mysqllog.log;
#mysqldump -u${dbuser} -p${dbpasswd} -F -B $db --master-data={1,2} --single-transaction --events |gzip> ${logpath}/${db}${backtime}.sql.gz 2>> ${logpath}/mysqllog.log
mysqldump -u${dbuser} -p${dbpasswd} -F -B $db --master-data={1,2} --single-transaction |gzip> ${logpath}/${db}${backtime}.sql.gz 2>> ${logpath}/mysqllog.log
#备份成功以下操作
if [ "$?" == 0 ];then
cd $datapath
#删除七天前备份,也就是只保存7天内的备份
#find $datapath -name "*.tar.gz" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1
find $datapath -name "*.gz" -type f -mtime +15 -exec rm -rf {} \; > /dev/null 2>&1
echo "${t_time} 数据库 ${db} 备份成功!!" >> ${logpath}/mysqllog.log
else
#备份失败则进行以下操作
echo "${t_time} 数据库 ${db} 备份失败!!" >> ${logpath}/mysqllog.log
fi
done
#备注:摘抄自己以前写的脚本
试题四
一个网站,使用了cdn,全国各地有几十个节点。需要你写一个shell脚本来监控各个节点是否正常。 假如
- 监控的url为www.aming.com/index.php
- 源站ip为88.88.88.88。
#!/bin/bash
s_ip=88.88.88.88
web_url=www.qq.com
ipf=/data/ip.list
function web_check() {
web_url=$1
server_ip=$2
d_time=`date +'%Y-%m-%d %H:%M:%S'`
web_code=`curl --connect-timeout 3 -I -x $server_ip:80 -s $web_url|sed -n '1p'`
if [ -z "$web_code" ]; then
echo "$d_time $server_ip $web_url 网站访问失败,请确认域名是否正确" >> /tmp/web.log
else
status_code=`echo $web_code|awk '{print $2}'`
if [ $status_code -eq 200 ]; then
echo "url:$web_url status:$status_code 请求成功"
else
echo "$d_time $server_ip $web_url 请求失败" >> /tmp/web.log
fi
fi
}
web_check $web_url $s_ip
for i in `cat $ipf`
do
web_check $web_url $i
done
试题五
已知下面的字符串是通过RANDOM随机数变量md5sum|cut -c 1-8截取后的结果,请破解这些字符串对应的md5sum前的RANDOM对应数字? 21029299 00205d1c a3da1677 1f6d12dd 890684ba
#!/bin/bash
for i in `seq 0 32767`
do
m=`echo $i|md5sum|cut -c 1-8`
echo $i $m
done > /tmp/md5.txt
cat >c.txt <
试题六
写一个脚本:
- 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。
- 如果其生产商为AuthenticAMD,就显示其为AMD公司;
- 如果其生产商为GenuineIntel,就显示其为Intel公司;
- 否则,就说其为非主流公司。
#!/bin/bash
an=`grep 'vendor_id' /proc/cpuinfo |tail -1 |awk '{print $NF}'`
case $an in
GenuineIntel)
echo "GenuineIntel"
;;
AuthenticAMD)
echo "AuthenticAMD"
;;
*)
echo "nothing..."
esac
试题七
用shell写一个监控服务器cpu使用率的监控脚本。
#!/bin/bash
cpu_count=100
function cup_check() {
c=`sar 1 5|tail -1|awk '{print $NF}'`
us_cpu=`echo "$cpu_count-$c"|bc`
us_cpu=`echo $us_cpu|sed 's/^\./0\./g'`
echo $us_cpu
}
while true
do
cup_check
sleep 5
done
试题八
给出一个进程PID,打印出该进程下面的子进程以及子进程下面的所有子进程。(只需要考虑子进程的子进程,再往深层次则不考虑)
ps -ef|grep 5840|awk '$3==5840{print $2}'
试题九
需求背景: 服务器上,跑的lamp环境,上面有很多客户的项目,每个项目就是一个网站。 由于客户在不断增加,每次增加一个客户,就需要配置相应的mysql、ftp以及httpd。这种工作重复性非常强的,所以用脚本实现非常合适。mysql增加的是对应客户项目的数据库、用户、密码,ftp增加的是对应项目的用户、密码(使用vsftpd,虚拟用户模式),httpd就是要增加虚拟主机配置段。
#!/bin/bash
#本脚本的功能是在LAMP环境中增加站点,包括apache配置、FTP增加用户、MySQL增加库和用户
#作者:猿课-阿铭 www.apelearn.com
#日期:2018-12-10
#网站目录
webdir=/data/wwwroot
#ftp的虚拟用户配置文件目录
ftpudir=/etc/vsftpd/vuuser
#ftp虚拟用户密码文件
ftpuserfile=/root/login
#mysql命令行登录root
mysqlc="/usr/local/mysql/bin/mysql -uroot -pjk1hYUcnt6"
#apache虚拟主机配置文件
httpd_config_f="/usr/local/apache2/conf/extra/httpd-vhosts.conf"
#定义增加MySQL库和用户的函数
add_mysql_user()
{
#生成随机密码
mysql_p=`mkpasswd -s 0 -l 12`
#将密码保存到临时文件里,这里的$pro为用户自定义的项目名字
echo "$pro $mysql_p" >/tmp/$pro.txt
#这里使用嵌入文档的形式(需顶格),将创建用户并授权的命令传递给mysql
$mysqlc <> $ftpuserfile
echo "$ftp_p" >> $ftpuserfile
#将用户、密码文件转换为密码db文件
db_load -T -t hash -f $ftpuserfile /etc/vsftpd/vsftpd_login.db
cd $ftpudir
#这里的aaa是一个文件,是之前的一个项目,可以作为配置模板
cp aaa $pro
#把里面的aaa改为新的项目名字
sed -i "s/aaa/$pro/" $pro
#重启vsftpd服务
/etc/init.d/vsftpd restart
}
#定义增加apache虚拟主机的函数
config_httpd()
{
#增加网站根目录,和域名保持一致,这里的$dom为用户自定义的域名
mkdir $webdir/$dom
#将网站根目录属主和属组设置为ftp用户
chown vsftpd:vsftpd $webdir/$dom
#用嵌入文档(需顶格),把虚拟主机配置写入到配置文件里
cat >> $httpd_config_f <
DocumentRoot $webdir/$dom
ServerName $dom
AllowOverride none
Require all granted
EOF
#重载apache服务
/usr/local/apache2/bin/apachectl graceful
}
read -p "input the project name: " pro
read -p "input the domain: " dom
add_mysql_user
add_ftp_user
config_httpd
#需求都看晕了,直接摘抄的
试题十
用shell写一个简易计算器,可以实现加、减、乘、除运算,假如脚本名字为1.sh,执行示例:./1.sh 1 + 2
#!/bin/bash
echo $*
echo $#
if [ $# -ne 3 ]; then
echo "请输入3个数值"
exit 5
fi
check_1=`echo $1|sed 's/[0-9.]//g'`
check_2=`echo $3|sed 's/[0-9.]//g'`
if [ -n "$check_1" -o -n "$check_2" ]; then
echo "请输入数值"
exit 8
fi
function wc_add() {
sum_count=`echo "$1+$3"|bc`
echo $sum_count
}
function wc_less() {
sum_count=`echo "$1-$3"|bc`
sum_count=`echo $sum_count|sed 's/^\./0\./g'`
echo $sum_count
}
function wc_mult() {
sum_count=`echo "$1*$3"|bc`
sum_count=`echo $sum_count|sed 's/^\./0\./g'`
echo $sum_count
}
function wc_dson() {
sum_count=`echo "scale=2;$1/$3"|bc`
sum_count=`echo $sum_count|sed 's/^\./0\./g'`
echo $sum_count
}
echo ">>>"$2
case $2 in
+)
wc_add $*
;;
-)
wc_less $*
;;
\*)
wc_mult $*
;;
/)
wc_dson $*
;;
*)
echo "USAGE:\$0 1 + 2"
;;
esac
#备注:乘法通配符有bug
留言