试题一
有两个文件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 <a.txt
试题二
把当前用户下所有进程名字中含有”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 indbname; do
#source=`mysqldump -u {dbuser} -p{dbpasswd} {db}>{logpath}/{db}{backtime}.sql` 2>> {logpath}/mysqllog.log;
#mysqldump -u{dbuser} -p{dbpasswd} -F -Bdb --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天内的备份
#finddatapath -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 -sweb_url|sed -n '1p'`
if [ -z "web_code" ]; then
echo "d_time server_ipweb_url 网站访问失败,请确认域名是否正确" >> /tmp/web.log
else
status_code=`echo web_code|awk '{print2}'`
if [ status_code -eq 200 ]; then
echo "url:web_url status:status_code 请求成功"
else
echo "d_time server_ipweb_url 请求失败" >> /tmp/web.log
fi
fi
}
web_check web_urls_ip
for i in `cat ipf`
do
web_checkweb_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`
echoi $m
done > /tmp/md5.txt
cat >c.txt <<EOF
21029299
00205d1c
a3da1677
1f6d12dd
890684ba
EOF
grep -f c.txt /tmp/md5.txt
试题六
写一个脚本:
- 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。
- 如果其生产商为AuthenticAMD,就显示其为AMD公司;
- 如果其生产商为GenuineIntel,就显示其为Intel公司;
- 否则,就说其为非主流公司。
#!/bin/bash
an=`grep 'vendor_id' /proc/cpuinfo |tail -1 |awk '{print NF}'`
casean 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=`echous_cpu|sed 's/^\./0\./g'`
echo $us_cpu
}
while true
do
cup_check
sleep 5
done
试题八
给出一个进程PID,打印出该进程下面的子进程以及子进程下面的所有子进程。(只需要考虑子进程的子进程,再往深层次则不考虑)
ps -ef|grep 5840|awk '3==5840{print2}'
试题九
需求背景: 服务器上,跑的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 <<EOF
create databasepro;
grant all on pro.* to "pro"@'127.0.0.1' identified by "mysql_p";
#下面这个EOF必须要顶格
EOF
}
#定义增加FTP用户的函数
add_ftp_user()
{
ftp_p=`mkpasswd -s 0 -l 12`
echo "pro" >> ftpuserfile
echo "ftp_p" >> ftpuserfile
#将用户、密码文件转换为密码db文件
db_load -T -t hash -fftpuserfile /etc/vsftpd/vsftpd_login.db
cd ftpudir
#这里的aaa是一个文件,是之前的一个项目,可以作为配置模板
cp aaapro
#把里面的aaa改为新的项目名字
sed -i "s/aaa/pro/"pro
#重启vsftpd服务
/etc/init.d/vsftpd restart
}
#定义增加apache虚拟主机的函数
config_httpd()
{
#增加网站根目录,和域名保持一致,这里的dom为用户自定义的域名
mkdirwebdir/dom
#将网站根目录属主和属组设置为ftp用户
chown vsftpd:vsftpdwebdir/dom
#用嵌入文档(需顶格),把虚拟主机配置写入到配置文件里
cat >>httpd_config_f <<EOF
<VirtualHost *:80>
DocumentRoot webdir/dom
ServerName dom
<Directorywebdir/$dom>
AllowOverride none
Require all granted
</Directory>
</VirtualHost>
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=`echo1|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`
echosum_count
}
function wc_less() {
sum_count=`echo "1-3"|bc`
sum_count=`echo sum_count|sed 's/^\./0\./g'`
echosum_count
}
function wc_mult() {
sum_count=`echo "1*3"|bc`
sum_count=`echo sum_count|sed 's/^\./0\./g'`
echosum_count
}
function wc_dson() {
sum_count=`echo "scale=2;1/3"|bc`
sum_count=`echo sum_count|sed 's/^\./0\./g'`
echosum_count
}
echo ">>>"2
case2 in
+)
wc_add *
;;
-)
wc_less*
;;
\*)
wc_mult *
;;
/)
wc_dson*
;;
*)
echo "USAGE:\$0 1 + 2"
;;
esac
#备注:乘法通配符有bug
留言