兄弟连 企业shell笔试题 1-15
这些题目收集自网络,对比原来的答案,又根据实际情况重新编写了自己的答案
企业实践题1:
(生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:
阶段1:开发一个守护进程脚本每30秒实现检测一次。
阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误。
阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分)
重点语句分析
mysql查看状态语句
mysql>show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.0.0.42
                  Master_User: backup
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 538
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 701
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
使用MysqlCmd2 命令筛选后语句:
Yes
Yes
0
0
it
#!/bin/bash port=
error=( )
MysqlCmd1= mysql -uroot -p192.168.51. -e
MysqlCmd2= mysql -uroot -p192.168.51. -e"show slave status\G"|egrep "_Running|Last_Errno|Behind_Master"|awk '{print $NF}' function is_run(){
[ `lsof -i:$port|wc -l` -lt ]&&{
echo"mysql is stop"
exit
}
} function mysql_status(){
array=(`$MysqlCmd2`)
} function judge_error(){
for i in ${error[*]}
do
if [ "${array[2]}" == "$i" ];then
$MysqlCmd1"stop slave;SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;start slave;"
else
echo "mysql is failed,error id is ${array[2]}"
fi
done
} judge_status(){
mysql_status
echo ${array[*]}
if [ "${array[0]}" == "Yes" -a "${array[1]}" == "Yes" -a "${array[3]}" == "" ];then
echo "Mysql slave is ok"
else
judge_error ${array[]}
fi
} function main(){
while true
do
is_run
judge_status
sleep
done
} main
企业实践题2:
使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为:
coaolvajcq_oldboy.html qnvuxvicni_oldboy.html
重点语句分析:
#tr -dc 的意思是,将字符串中a到z 以外的字符提取并删除,只保留小写字母
#!/bin/bash
dir=/oldboy
[ ! -d $dir ] && mkdir -p $dir for((i=;i<=;i++ ))
do
a=`tr -dc "a-z" < /dev/urandom | head -c `_oldboy,html
touch $dir/$a
done
企业实践题3:
请用至少两种方法实现!
将以上文件名中的oldboy全部改成oldgirl(用for循环实现),并且html改成大写。
重点语句分析:
sed 's/A/B/g' 将A替换为B
awk -F '_' 以_为分解符
#!/bin/bash
cd /root/oldfile for a in `ls`
do
b=`echo $a|sed 's/oldboy.html/oldgirl.HTML/g'`
mv $a $b
done
#!/bin/bash
cd /root/oldfile for a in `ls`
do
b=`echo $a|awk -F '_' '{print $1}' `
mv $a $b_oldgirl.HTML
done
企业实践题4:
批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)
#!/bin/bash for ((i=;i<=;i++ ))
do
a=`cat /dev/urandom | head -n |md5sum| head -c `
useradd -p $a oldboy$i >> ./user_pass
done
企业面试题5:
写一个脚本,实现判断10.0.0.0/24网络里,当前在线用户的IP有哪些(方法有很多)
重点语句分析:
shell中使用 let进行数字计算
#!/bin/bash
ip=10.0..
declare -i success=
declare -i down= for a in `seq `;do
ping -c "$ip$a" >/dev/null >&
if [ "$?" -eq ];then
echo "$ip$a is up"
let success+=
else
echo "$ip$a is down"
let down+=
fi
done echo success:$success fail:$down
企业实战题6:
请用至少两种方法实现!
写一个脚本解决DOS攻击生产案例
提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。
防火墙命令为:iptables -I INPUT -s 10.0.1.10 -j DROP。
方法1:
设定触发条件 为并发连接数 达到100 即封掉ip
重点语句分析
先输出所有建立连接的ip地址,从大到小进行排序
netstat -an|grep ESTABLISHED|awk -F '[: ]+' '{print $6}' |sort|uniq -c|sort -nr
如果netstat输出带有ipv6的   ::ffff:  字符串,用这个改进过的语句进行过滤
netstat -an|grep ESTABLISHED|awk '{print $5}'|sed 's/::ffff://g'|awk -F: '{print $1}'|sort|uniq -c|sort -nr
输出结果
210 10.11.0.78
      100 61.158.175.44
      100 42.234.11.172
91 221.13.156.210
81 10.11.0.79
21 10.0.7.99
顺序执行
#!/bin/bash
while true
do
netstat -an|grep ESTABLISHED|awk -F '[: ]+' '{print $6}'|sort|uniq -c|sort|while read line
do
ip=`echo $line|awk '{print $2}'`
count=`echo $line|awk '{print $1}'`
if [ "$count -ge 100 ] && [ `iptables -L -n|grep "$ip"|wc -l` lt 1 ];then
iptables -I INPUT -s "$ip" -j DROP
echo $ip is DROP >> drop_list.log
# fi
done
sleep
done
设计为函数
#!/bin/bash log=/tmp/ipdos.log
[ -f $log ] || touch $log add_iptables(){
while read line
do
ip=`echo $line|awk '{print $2}'`
count=`echo $line|awk '{print $1}'`
if [ "$count" -ge 100 ] && [ `iptables -L -n|grep "$ip"|wc -l` lt 1 ];then
iptables -I INPUT -s "$ip" -j DROP
echo $ip is DROP
fi
done < $log
} main(){
while true
do
netstat -an|grep ESTABLISHED|awk -F '[: ]+' '{print $6}'|sort|uniq -c|sort > $log
add_iptables
sleep
done
} main
方法2:
设定触发条件 为过去三分钟内 访问日志中 ip达到100条记录(即pv)  即封掉ip
重点语句分析
web日志的格式
192.168.51.254 - - [22/Nov/2017:09:31:09 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
192.168.51.254 - - [22/Nov/2017:09:31:09 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
192.168.51.254 - - [22/Nov/2017:09:31:09 +0800] "GET /index.html HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
先来处理时间,让输出时间与日志中时间格式一致
#date "+%d/%b/%Y:%H:%M"
22/Nov/2017:09:31
当前时间的前一分钟和前两分钟表达方式
time1=`date "+%d/%b/%Y:%H:%M" -d "-1 minute"`
time2=`date "+%d/%b/%Y:%H:%M" -d "-2 minute"`
#!/bin/bash log=/tmp/dosip.log
access_log="/usr/local/nginx/logs/access.log" [ -f $log ] || touch $log time=`date "+%d/%b/%Y:%H:%M"`
time1=`date "+%d/%b/%Y:%H:%M" -d "-1 minute"`
time2=`date "+%d/%b/%Y:%H:%M" -d "-2 minute"` add_iptables(){
while read line
do
ip=`echo $line|awk '{print $2}'`
count=`echo $line|awk '{print $1}'`
if [ "$count" -ge ] && [ `iptables -L -n|grep "$ip"|wc -l` -lt ];then
iptable -I INPUT -s "$ip" -j DROP
echo "$ip" is DROP
fi
done < $log
} main(){
while true
do
cat $access_log|egrep "$time|$time1|$time2"|awk '{print $1}'|sort|uniq -c > $log
add_iptables
sleep
done
} main
企业实战题7:
开发mysql多实例启动脚本:
已知mysql多实例启动命令为:mysqld_safe--defaults-file=/data/3306/my.cnf &
停止命令为:mysqladmin -u root -poldboy123 -S /data/3306/mysql.sockshutdown
请完成mysql多实例启动启动脚本的编写
要求:用函数,case语句、if语句等实现。
重点语句分析
先判断 functions 这个文件是否存在,存在即加载 这个文件为shell 提供了一些基础的功能,会设置umask,path,还有语言环境,然后会设置success,failure,warning,normal几种情况下的字体颜色
action 函数是functions中一个重要的函数,它的作用是打印某个提示信息并执行给定命令
action:打印某个信息并执行给定的命令,它会根据命令执行的结果来调用 success,failure方法
action() {
  local STRING rc
STRING=$1
  echo -n "$STRING "
  shift
  "$@" && success $"$STRING" || failure $"$STRING"
  rc=$?
  echo
  return $rc
}
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
MYUSER=root
MYPASS=oldboy123
SOCKET=/data/3306/mysql.sock
MYCNF=/data/3306/my.cnf
MYCMD="mysql -u$MYUSER -p$MYPASS -S$SOCKET"
MYADMIN="mysqladmin -u$MYUSER -p$MYPASS -S$SOCKET"
judge(){ 
if [ $RETVAL -eq  ];then 
  action "$1 mysql" /bin/true 
else 
  action "$1 mysql" /bin/false 
fi 
return $RETVAL 
} 
start(){ 
mysqld_safe --defaults-file=$MYCNF &>/dev/null & 
RETVAL=$? sleep  
judge start 
} 
stop()
{ 
mysqladmin -u$MYUSER -p$MYPASS -S$SOCKET shutdown >/dev/null >& 
RETVAL=$? 
judge stop 
}
case "$1" in 
   start)
     start
     ;;
   stop)
     stop
     ;;
   restart)
     stop
     sleep 3
     start
     ;;
   *)
   echo "$0 {start|stop|restart}"
   exit $retval
esac
企业实战题8:
如何实现对MySQL数据库进行分库备份,请用脚本实现
重点语句分析
备份语句 :
mysqldump -u$MYUSER -p$MYPASS -S$SOCKET -x -B -F -R databaseName
-x 提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,
并且自动关闭--single-transaction 和--lock-tables 选项。
-B 备份指定的库
-F 开始导出之前刷新日志。
请注意:假如一次导出多个数据库(使用选项--databases或者--all-databases),将会逐个数据库刷新日志。
除使用--lock-all-tables或者--master-data外。在这种情况下,日志将会被刷新一次,相应的所以表同时被锁定。
因此,如果打算同时导出和刷新日志应该使用--lock-all-tables 或者--master-data 和--flush-logs。
-R 导出存储过程以及自定义函数
提取数据库名称到数组:
dataArray=(`mysql -uroot -pxxx -e"show databases;" |egrep -v "Database|schema"`)
#!/bin/bash user=root
pwd=192.168.51.9
socket="/var/lib/mysql/mysql.sock"
mysqldump="mysqldump -u$user -p$pwd -S$socket -x -B -F -R"
backup=/var/sqlbackup [ -f $backup ] || mkdir -p $backup
dataArray=(`mysql -u$user -p$pwd -e"show databases;" |egrep -v "Database|schema"`) for i in ${dataArray[*]}
do
$mysqldump $i | gzip > ${backup}/"$i"_$(date +"%F").sql.gz
done
企业实践题9:
如何实现对MySQL数据库进行分库加分表备份,请用脚本实现
重点语句分析
备份语句 :
mysqldump -u$MYUSER -p$MYPASS -S$SOCKET -x -F -R databaseName tableName
用两个for循环来备份每一张表
这里将各数据库名称存到数组里
将各个表名存在字符串中
#!/bin/bash user=root
pwd=192.168.51.9
socket="/var/lib/mysql/mysql.sock"
mysqldump="mysqldump -u$user -p$pwd -S$socket -x -F -R"
backup=/var/sqlbackup2 [ -f $backup ] || mkdir -p $backup dataArray=(`mysql -u$user -p$pwd -e"show databases;" |egrep -v "Database|schema"`) for i in ${dataArray[*]}
do
Table=`mysql -u$user -p$pwd -e"show tables from $i" | egrep -v "Tables_in_"`
for t in $Table
do
$mysqldump $i $t | gzip > ${backup}/"$i"_"$t"_`date +"%F"`.sql.gz
done done
企业实践题10:
请用至少两种方法实现!
bash for循环打印下面这句话中字母数不大于6的单词(昆仑万维面试题)。
I am oldboy teacher welcome to oldboy training class.
方法一:数组 + for循环
重点语句分析
${#i} 取字符串长度
#!/bin/bash
array=(I am oldboy teacher welcome to oldboy training class)
for i in ${array[*]}
do
if [ ${#i} -le ];then
echo -n "$i "
fi
done echo
方法二:for循环 + awk判断字符串长度
重点语句分析
awk里引用shell中的变量 用 '"$i"'
#!/bin/bash
a="I am oldboy teacher welcome to oldboy training class"
b=`echo "$a"|wc -w` for ((i=;i<=$b;i++))
do
if [ `echo $a|awk '{print length($'"$i"')}'` -le ];then
echo $a| awk '{print $'"$i"'}'
fi
done
企业实践题11:
开发shell脚本分别实现
以脚本传参以及read读入的方式比较2个整数大小。以屏幕输出的方式提醒用户比较结果。
注意:一共是开发2个脚本。当用脚本传参以及read读入的方式需要对变量是否为数字、并且传参个数做判断。
脚本1 以read读入的方式
重点语句分析:
判断字符串为纯数字 "$num1" =~ ^[0-9]+$
^[0-9]+$ 表示 正则表达式 以数字开头 以数字结尾 中间有1到无限个数字 的字符串
或者
[ "`echo "$num1"|sed -r ' s/[^0-9]//g'`" = "$num1" ] || {
    echo "first arg must be int."
    exit 2
}
#!/bin/bash
echo -e "please enter two number separated by space \n like 5 4 "
read num1 num2
if [[ "$num1" =~ ^[-]+$ && "$num2" =~ ^[-]+$ ]];then
if [ "$num1" -gt "$num2" ];then
echo "$num1 > $num2"
elif [ "$num1" -eq "$num2" ];then
echo "$num1 = $num2"
else
echo "$num1 < $num2"
fi
else
echo not number,please input number
fi
脚本2 用脚本传参的方式
重点语句分析:
#!/bin/bash
if [[ "$1" =~ ^[-]+$ && "$2" =~ ^[-]+$ ]];then
if [ "$1" -gt "$2" ];then
echo "$1 > $2"
elif [ "$1" -eq "$2" ];then
echo "$1 = $2"
else
echo "$1 < $2"
fi
else
echo not number,please input number
fi
企业实践题12:
打印选择菜单,一键安装Web服务:
要求:
1、当用户输入1时,输出“startinstalling lamp.”然后执行/server/scripts/lamp.sh,脚本内容输出"lampis installed"后退出脚本;
2、当用户输入2时,输出“startinstalling lnmp.”然后执行/server/scripts/lnmp.sh输出"lnmpis installed"后退出脚本;
3、当输入3时,退出当前菜单及脚本;
4、当输入任何其它字符,给出提示“Input error”后退出脚本。
5、要对执行的脚本进行相关条件判断,例如:脚本是否存在,是否可执行等。
方法一:使用单个判断
#!/bin/bash
mean(){
echo -e "********************\n"
echo -e "1.Install LAMP\n"
echo -e "2.INstall LNMP\n"
echo -e "3.exit"
} mean read -p "enter your select: " num [ $num -eq ] && {
echo "start install LAMP"
if [ -x /root/lamp.sh ];then
/bin/bash /root/lamp.sh
else
echo "not exit lamp.sh or permission denied"
exit
fi
} [ $num -eq ] && {
echo "start install LNMP"
if [ -x /root/lnmp.sh ];then
/bin/bash /root/lamp.sh
else
echo "not exit lamp.sh or permission denied"
exit
fi
} [ $num -eq ] && {
exit
} echo "input is error"
方法二:使用case
#!/bin/bash
mean(){
echo -e "********************\n"
echo -e "1.Install LAMP\n"
echo -e "2.INstall LNMP\n"
echo -e "3.exit"
}
mean read -p "enter your select: " num case $num in
"")
echo "start install LAMP"
if [ -x /root/lamp.sh ];then
/bin/bash /root/lamp.sh
else
echo "not exit lamp.sh or permission denied"
exit
fi
;; "")
echo "start install LNMP"
if [ -x /root/lamp.sh ];then
/bin/bash /root/lnmp.sh
else
echo "not exit lnmp.sh or permission denied"
exit
fi
;; "")
exit
;; *)
echo "input is error"
;;
企业实践题13:
1、监控web服务是否正常,不低于3种监控策略。
2、监控db服务是否正常,不低于3种监控策略。
     要求间隔1分钟,持续监控。
重点语句分析:
主要在于监控的方法,对于web和db 都通用的方法有 ping、netstat、ps
web还可以用curl来监控
db还可以用 mysql -u -p -e"show databases"
脚本1 四种方法监控web服务
#!/bin/bash
ip=10.0.0.45
index=10.0.0.45
port=
process="nginx: master process" ping_stat(){
ping -c $ip >/dev/null >&
if [ "$?" -ne ];then
echo "the web server $ip is down "
fi
} curl_stat(){
http_code=`curl -m -s -o /dev/null -w %{http_code} $index`
if [ $http_code -ne ];then
echo "the web index is down"
fi
} net_stat(){
a=`netstat -anlt|grep -w $port|wc -l`
[ "$a" -lt ] && echo "the web listen is down "
} ps_aux(){
b=`ps aux |grep "$process"|grep -v grep|wc -l`
[ "$b" -lt ] && echo "the web process is down "
} main(){
while true
do
ping_stat
curl_stat
net_stat
ps_aux
sleep 60
done
} main
脚本2 四种方法监控数据库
#!/bin/bash ip=10.0.0.45
port=
process="/usr/sbin/mysqld" ping_stat(){
ping -c $ip >/dev/null >&
if [ "$?" -ne ];then
echo "the database server $ip is down "
fi
} database_stat(){
count=`mysql -uroot -p192.168.51. -e"show databases"|grep -w "ERROR"|wc -l `
if [ $count -ge ];then
echo "the database is down"
fi
} net_stat(){
a=`netstat -anlt|grep -w $port|wc -l`
[ "$a" -lt ] && echo "the database listen is down "
} ps_aux(){
b=`ps aux |grep "$process"|grep -v grep|wc -l`
[ "$b" -lt ] && echo "the database process is down "
}
"13.2old.sh" 42L, 617C written
[root@fastdfs2 ~]# vi .2old.sh
#!/bin/bash ip=10.0.0.45
port=
process="/usr/sbin/mysqld" ping_stat(){
ping -c $ip >/dev/null >&
if [ "$?" -ne ];then
echo "the database server $ip is down "
fi
} database_stat(){
count=`mysql -uroot -p192.168.51. -e"show databases"|grep -w "ERROR"|wc -l `
if [ $count -ge ];then
echo "the database is down"
fi
} net_stat(){
a=`netstat -anlt|grep -w $port|wc -l`
[ "$a" -lt ] && echo "the database listen is down "
} ps_aux(){
b=`ps aux |grep "$process"|grep -v grep|wc -l`
[ "$b" -lt ] && echo "the database process is down "
} main(){
while true
do
ping_stat
database_stat
net_stat
ps_aux
sleep 60
done
} main
企业实践题14:
监控memcache服务是否正常,模拟用户(web客户端)检测。
使用nc命令加上set/get来模拟检测,以及监控响应时间及命中率。
重点语句分析:
使用nc
设置值  printf "set test 0 0 4\r\ngood\r\n"|nc 10.0.0.45 12000
取值      printf "get test\n"|nc 10.0.0.45 12000
监控响应时间 
time echo stats |nc 10.0.0.45 12000 &>/dev/null
监控命中率a  
hit=`echo stats |nc 10.0.0.45 12000|grep get_hits|awk '{print $3}'`
miss=`echo stats |nc 10.0.0.45 12000|grep get_misses|awk '{print $3}'`
let a=$hit/($hit+$miss)
#!/bin/bash printf "set test 0 0 4\r\ngood\r\n"|nc 10.0.0.45
a=`printf "get test\n"|nc 10.0.0.45 |awk 'NR==2 {print $0}'` [ $a == "good"] || echo "memcache is down" && time echo stats |nc 10.0.0.45 &>/dev/null hit=`echo stats |nc 10.0.0.45 |grep get_hits|awk '{print $3}'`
miss=`echo stats |nc 10.0.0.45 |grep get_misses|awk '{print $3}'`
let b=$hit/'($hit+$miss)' echo "the memcache hit is $b"
企业实践题15:
监控web站点目录(/var/html/www)下所有文件是否被恶意篡改(文件内容被改了)
如果有就打印改动的文件名(发邮件),定时任务每3分钟执行一次(10分钟时间完成)。
重点语句分析:
这道题有个简单的办法,直接使用inotify 实时监控目录中的变化,先写一个这个脚本再写一个常规的脚本
方法一:inotify
这是一个很简单的脚本,没有对inotify的输出信息做更好的过滤(类似下面输出)
/var/www/html/123MODIFY
/var/www/html/.1.html.swpMODIFY
/var/www/html/.1.html.swpMODIFY
/var/www/html/.1.html.swpMODIFY
/var/www/html/1.htmlMOVED_FROM
/var/www/html/1.html~MOVED_TO
/var/www/html/1.htmlMODIFY
/var/www/html/.1.html.swpMODIFY
#!/bin/bash webdir=/var/www/html inotifywait -rm -e move,modify --format '%w%f%e' $webdir|while read info
do
echo "$info"|mail -s "warring" yourmail@.com
done
方法二:
常规方法,网上流传的脚本都是 通过这条命令 find $DIR -print0 | xargs -0 du -ab
来输出每个文件的 大小,然后将前后两次的输出做比对。
再把脚本设置crontab 定时就行了
这个脚本的缺点是,如果修改前后的文件大小一致,则无法出现告警!!!
先看一下这个脚本
先运行
find $webdir -print0 | xargs -0 du -ab > $TMP_A
脚本: #!/bin/bash webdir=/var/www/html
TMP_A=/tmp/a.txt
TMP_B=/tmp/b.txt
TMP_C=/tmp/c.txt find $webdir -print0 | xargs - du -ab > $TMP_B
diff $TMP_A $TMP_B > $TMP_C
if [ -z $TMP_C ];then
echo "html is good"
else
text=`cat $TMP_C|awk '{print $3}'|sort -n|uniq|sed '/^$/d'`
echo $text | mail -s "warring" yourmail@.com
fi
方法三
对比每个文件的md5 来实现
首先创建原始MD5文件,old_md5.txt,以这个文件为依据。
第二步 对比文件数量,看文件数是否增多或者减少
第三步 对比新旧文件的MD5值,看是否发生修改
#!/bin/bash webdir=/var/www/html
old_md5=/tmp/old_md5.txt 原始MD5文件
oldfiles=/tmp/old_files.txt 原始文件名列表
newfiles=/tmp/new_files.txt 新文件名列表
mailtext=/tmp/mail.txt 邮件内容
初始化 原始MD5函数;没有原始MD5文件没有$1 则提示输入web目录;有$1则创建初始化MD5文件;
old_md5(){
if [ ! -f $old_md5 ];then
if [ -z "$1" ];then
echo "md5 file is not exit,please add argument that web directory absolute path "
echo "$1"
exit
else
find $ -type f|xargs md5sum > $old_md5 #创建web目录下每个文件的MD5
exit
fi
fi
}
对比文件数量,检测时候有被删除或者新增加的web 文件
compare_files(){
cat $old_md5|awk '{print $2}'|sort > $oldfiles
find $webdir -type f|sort > $newfiles
echo "the lost files:"
comm - "$oldfiles" "$newfiles" > $mailtext
echo "the add files:"
comm - "$oldfiles" "$newfiles" > $mailtext
}
对比每个文件的MD5,检测文件是否被修改过
compare_md5(){
echo "file content check: "
while read line
do
filename=`echo $line|awk '{print $2}'`
filemd5=`echo $line|awk '{print $1}'`
newmd5=`md5sum $filename|awk '{print $1}'`
if [ "$filemd5" = "$newmd5" ];then
echo "$filename md5 is correct"
else
echo -e "\033[31m$filename md5 is error\033[0m" > $mailtext
fi
done < $old_md5
} main(){
old_md5 $
compare_files
compare_md5
} main $
[ -f $mailtext ] && mail -s "warring" yourmail@.com < $mailtext $$ rm -y $mailtext
兄弟连 企业shell笔试题 1-15的更多相关文章
- 兄弟连 企业shell笔试题 16-31
		
企业实践题16:企业案例:写网络服务独立进程模式下rsync的系统启动脚本 例如:/etc/init.d/rsyncd{start|stop|restart} .要求:1.要使用系统函数库技巧.2.要 ...
 - 企业Shell面试题及企业运维实战案例(三)
		
1.企业Shell面试题1:批量生成随机字符文件名案例 使用for循环在/oldboy目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy,名称示例如下: ...
 - 企业Shell面试题5:解决DOS攻击生产案例
		
企业Shell面试题5:解决DOS攻击生产案例 写一个Shell脚本解决DOS攻击生产案例. 请根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100(读者根据实际情况设定 ...
 - Shell笔试题3
		
1.查找当前目录中所有大于500M的文件,把这些文件名写到一个文本文件中,并统计其个数.find ./ -size +500M -type f | tee file_list | wc -l 2.在目 ...
 - 企业shell面试题及解答
		
1.面试题:使用for循环在/tmp目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字母加固定字符串template,示例如下 aaesdffbnv_template.html 方 ...
 - Shell笔试题2
		
1. 从a.log文件中提取包含"WARNING"或"FATAL",同时不包含"IGNOR"的行,然后提取以":"分割的 ...
 - Shell笔试题1
		
1.用Shell编程,判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录下. #!/bin/bash#1.sh#判断一文件是不是字符或块设备文件,如果是将其拷贝到 /dev 目录下#f ...
 - 转:shell笔试题
		
源地址:http://blog.csdn.net/zcsylj/article/details/6799632 1.用Shell编程,判断一文件是不是块或字符设备文件,如果是将其拷贝到 /dev 目录 ...
 - 企业shell面试题:获取51CTO博客列表倒序排序考试题
		
#!/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HTMLFILE=/home/oldboy/ht ...
 
随机推荐
- Ambari下安装oozieUI界面无法访问问题
			
前言: 其他集群管理工具安装oozie和手动编译安装oozie,关于oozie的UI界面无法访问的问题,大致和该方法类似. 找到下面4步骤里的视图显示的目录,有一个ext-2.2软链指向的路径 lrw ...
 - Webpack实战(三):作为前端你不得不懂的Webpack资源入口和出口的配置
			
关于Webpack前两篇跟大家分享的主要是Webpack的一些基本的配置,今天开始我们详细了解一下有关Webpack的各种配置,今天主要跟大家分享的是Webpack的资源入口和资源出口的配置. 如果想 ...
 - Go 每日一库之 viper
			
简介 上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库. viper 是一个配置解决方案,拥有丰富的特性: 支持 JSON/TOML/YAML/HCL/envfile/ ...
 - AVR单片机教程——串口接收
			
本文隶属于AVR单片机教程系列. 上一讲中,我们实现了单片机开发板向电脑传输数据.在这一讲中,我们将通过电脑向单片机发送指令,让单片机根据指令控制LED.这一次,两端的TX与RX需要交叉连接,单片 ...
 - 异数OS 2017 DPDK 峰会观后感
			
1.DPDK in Container 使用虚拟网卡设备技术为每一个容器分配一个IP 网卡适配器(queue).容器技术可以解决虚拟机技术中虚拟机过于臃肿,难于热迁移的问题,可能可以代替美团OVS方案 ...
 - python函数和lambda表达式学习笔记
			
1. python函数 不同于其他语言,python支持函数返回多个值 为函数提供说明文档:help(函数名)或者函数名.__doc__ def str_max(str1, str2): ''' 比较 ...
 - 【WPF学习】第十五章  WPF事件
			
前两章学习了WPF事件的工作原理,现在分析一下在代码中可以处理的各类事件.尽管每个元素都提供了许多事件,但最重要的事件通常包括以下5类: 生命周期事件:在元素被初始化.加载或卸载时发生这些事件. 鼠标 ...
 - 【java面试】算法篇
			
1.冒泡排序 /** * 冒泡排序 * 比较相邻的元素.如果第一个比第二个大,就交换他们两个. * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. ...
 - 《Netlogo多主体建模入门》笔记 2
			
从自带的模型库开始 财富分配模型 黄色代表稻谷,有的人消化快,有的慢,稻谷的积累代表财富的积累,不涉及交易行为. 点击setup后 ,点击 go 红线--穷人: 绿线-- 中产 : 蓝 ...
 - 解决虚拟机中Linux不能上网的问题
			
第一步.虚拟机中的设置 点击右上角的网络标识,点击network settings,选择Wired,Add Profile,IPv4,Addresses设置成Automatic(DHCP),完成设置点 ...