试题一

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

  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 -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 <

试题六

写一个脚本:

  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}'`

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
最后修改日期: 2020年8月27日

作者

留言

撰写回覆或留言

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