试题一

有两个文件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脚本来监控各个节点是否正常。 假如

  1. 监控的url为www.aming.com/index.php
  2. 源站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

试题六

写一个脚本:

  1. 判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。
  2. 如果其生产商为AuthenticAMD,就显示其为AMD公司;
  3. 如果其生产商为GenuineIntel,就显示其为Intel公司;
  4. 否则,就说其为非主流公司。
#!/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
最后修改日期: 2020年8月27日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。