buhao 发表于 2018-8-20 11:12:05

shell编程19例

  个人博客地址:
  http://www.z-dig.com/shell-scripting-in-19-cases.html
  本文所有题目来自于老男孩51cto博客,地址如下:
  http://oldboy.blog.51cto.com/2561410/1632876
  转载请注明最原始出处。
  本文中所有题目答案都是按我自己的思路整理的,并不代表最完美答案,适合新手学习参考。
  由于代码是从word中复制过来的,文章发布后发现所有的代码格式都乱了(一律左对齐了),╮(╯▽╰)╭,之后又用了很长时间手动更改代码的格式,因为是手动,难免有疏忽,而且改的也不是很规范,格式上错乱的地方望见谅。
  目录:
  1       监控mysql主从同步... 2
  2       批量创建文件... 3
  3       批量改名... 4
  4       批量创建账户... 4
  5       判断当前局域网存在的主机... 5
  6       写一个脚本解决DOS***生产案例... 5
  7       开发mysql多实例启动脚本... 6
  8       对MySQL数据库进行分库备份... 8
  9       对MySQL数据库进行分库加分表备份... 8
  10         字符串打印... 9
  11          计算比较... 9
  12         打印菜单(堡垒机)... 11
  13         检测web服务及mysql服务... 12
  14         监控memcached. 15
  15         监控web站点目录是否被篡改... 16
  16         rsync服务启动脚本... 17
  17         抓阄题... 18
  18         暴力破解密码... 20
  19         批量检查多个网站地址是否正常... 21
1         监控mysql主从同步
  (生产实战案例):监控MySQL主从同步是否异常,如果异常,则发送短信或者邮件给管理员。提示:如果没主从同步环境,可以用下面文本放到文件里读取来模拟:
  阶段1:开发一个守护进程脚本每30秒实现检测一次。
  阶段2:如果同步出现如下错误号(1158,1159,1008,1007,1062),则跳过错误。
  阶段3:请使用数组技术实现上述脚本(获取主从判断及错误号部分)
#!/bin/bash  

  
#lixinyu linux
  

  
#2015-5-15
  

  
#监控mysql主从同步
  

  

  

  
USER=root
  

  
PASSWORD=123456
  

  
PORT=3307
  

  
error=(1158 1159 1008 1007 1062)
  

  
MYSQLCMD="mysql -u$USER -p$PASSWORD -S /data/$PORT/mysql.sock"
  

  

  

  
is_run(){
  

  
[ `lsof -i:$PORT|wc -l` -lt 2 ]&&{
  

  
    echo "mysql server is stoping"
  

  
    exit 1
  

  
}
  

  
}
  

  

  

  
status_array(){
  

  
status=($($MYSQLCMD -e "show slave status\G"|egrep "_Running|Last_Errno|Behind_Master"|awk '{print $NF}'))
  

  
}
  

  

  

  
status_error(){
  

  
flag=0
  

  
for((i=0;i&1
  

  
if [ $? -eq 0 ]
  

  
    then
  

  
      action "10.0.0.$i is ok" /bin/true
  

  
else
  

  
      action "10.0.0.$i is ok" /bin/false
  

  
fi
  

  
done
6         写一个脚本解决DOS***生产案例
  提示:根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。防火墙命令为:iptables-A INPUT -s 10.0.1.10 -j DROP。
  方法一(注意在函数中,iptables命令要使用全路径)
#!/bin/bash  

  

  

  
count=(`egrep "EST" netstat.log |awk -F "[ :]+"'{print $6}'|sort -n|uniq -c|awk '{print $1}'`)
  

  
ip=(`egrep "EST" netstat.log |awk -F "[ :]+"'{print $6}'|sort -n|uniq -c|awk '{print $2}'`)
  

  
iptables(){
  

  
for ((i=0;i>/opt/DOS.log
  

  
      echo ${count[$i]}${ip[$i]} >> /opt/DOS.log
  

  
      /sbin/iptables -A INPUT -s ${ip[$i]} -j DROP
  

  
fi
  

  
done
  

  
}
  

  
main(){
  

  
while true
  

  
do
  

  
iptables
  

  
sleep 180
  

  
done
  

  
}
  

  

  

  
main
  方法二:
while true  

  
do
  

  
#awk '{print $1}' access.log|grep -v "^$"|sort|uniq -c >/tmp/tmp.log
  

  
grep EST a.log|awk -F '[ :]+' '{print $6}'|sort|uniq -c >/tmp/tmp.log
  

  
#netstat -an|grep EST|awk -F '[ :]+' '{print $6}'|sort|uniq -c >/tmp/tmp.log
  

  
exec >/tmp/droplist.log
  

  
    fi
  

  
done
  

  
sleep 5
  

  
done
  加入定时任务
  */3 * * * * /bin/sh /server/scripts/ip_drop.sh >/dev/null 2>&1
7         开发mysql多实例启动脚本
  已知mysql多实例启动命令为:mysqld_safe--defaults-file=/data/3306/my.cnf &
  停止命令为:mysqladmin -u root -poldboy123 -S /data/3306/mysql.sockshutdown
  请完成mysql多实例启动启动脚本的编写
  要求:用函数,case语句、if语句等实现。
#!/bin/bash  

  
#lixinyu linux
  

  
#2015-5-15
  

  
# chkconfig: 2345 25 60
  

  
# description: mysql start and stop scripts
  

  

  

  
. /etc/init.d/functions
  

  
DIR=/data/3306
  

  
USER=root
  

  
PASSWORD=123456
  

  
PORT=3306
  

  

  

  
function mysql_start(){
  

  
PID=`lsof -i:$PORT|wc -l`
  

  
[ $PID -lt 2 ]&&{
  

  
/usr/local/sbin/mysqld_safe--defaults-file=$DIR/my.cnf>/dev/null 2>&1 &
  

  
if [ $? -eq 0 ]
  

  
    then
  

  
      sleep 3
  

  
      action "mysqld is start" /bin/true
  

  
else
  

  
      action "mysqld is start" /bin/false
  

  
fi
  

  
return 0
  

  
}||{
  

  
action "The mysql is running now" /bin/false
  

  
return 1
  

  
}
  

  
}
  

  

  

  
function mysql_stop(){
  

  
PID=`lsof -i:$PORT|wc -l`
  

  
[ $PID -ge 2 ]&&{
  

  
/usr/local/sbin/mysqladmin -u $USER -p"$PASSWORD" -S $DIR/mysql.sock shutdown>/dev/null 2>&1 &
  

  
if [ $? -eq 0 ]
  

  
    then
  

  
      sleep 3
  

  
      action "mysqld is stop" /bin/true
  

  
else
  

  
      action "mysqld is stop" /bin/false
  

  
fi
  

  
return 0
  

  
}||{
  

  
action "The mysql is stoping now" /bin/false
  

  
return 1
  

  
}
  

  
}
  

  

  

  
function USAGE(){
  

  
echo "USAGE:$0 {start|stop|restart}"
  

  
}
  

  
[ $# -ne 1 ]&&{
  

  
USAGE
  

  
exit 1
  

  
}
  

  
case "$1" in
  

  
start)
  

  
   mysql_start
  

  
   ;;
  

  
stop)
  

  
   mysql_stop
  

  
   ;;
  

  
restart)
  

  
   mysql_stop
  

  
   mysql_start
  

  
   ;;
  

  
*)
  

  
   USAGE
  

  
esac
8         对MySQL数据库进行分库备份
#!/bin/bash  

  
#lixinyu linux
  

  
#2015-5-20
  

  

  

  
user=root
  

  
password=123456
  

  
sock=/data/3306/mysql.sock
  

  
MYCMD="mysql -u$user -p$password -S $sock"
  

  
MYDUMP="mysqldump-u$user -p$password -S $sock"
  

  

  

  
for database in `$MYCMD-e "show databases;"|sed '1d'|egrep -v 'mysql|_schema'`
  

  
do
  

  
$MYDUMP -B --master-data=2 --events --single-transaction $database|gzip >/opt/${database}_$(date +%F).sql.gz
  

  
done
9         对MySQL数据库进行分库加分表备份
#!/bin/bash  

  
#lixinyu linux
  

  
#2015-5-20
  

  

  

  
user=root
  

  
password=123456
  

  
sock=/data/3306/mysql.sock
  

  
MYCMD="mysql -u$user -p$password -S $sock"
  

  
MYDUMP="mysqldump-u$user -p$password -S $sock"
  

  

  

  
for database in `$MYCMD-e "show databases;"|sed '1d'|egrep -v "mysql|_schema"`
  

  
do
  

  
mkdir /backup/${database} -p
  

  
for table in `$MYCMD -e "show tables from $database"|sed "1d"`
  

  
do
  

  
    $MYDUMP $database $table|gzip >/backup/${database}/${database}.${table}_$(date +%F).sql.gz
  

  
done
  

  
done
10    字符串打印
  请用至少两种方法实现!
  bash for循环打印下面这句话中字母数不大于6的单词(昆仑万维面试题)。

  I am oldboy teacher welcome to oldboy training>  方法一
#!/bin/bash  

  

  

  
for n in I am oldboy teacher welcome to oldboy training class
  

  
do
  

  
if [ ${#n} -le 6 ];then
  

  
    echo $n
  

  
fi
  

  
done
  方法二
#!/bin/bash  

  

  

  
chars=(I am oldboy teacher welcome to oldboy training class)
  

  
for ((i=0;i/dev/null
  

  
RETVAL_A=$?
  

  
expr $b + 1 &>/dev/null
  

  
RETVAL_B=$?
  

  
[ $RETVAL_A -ne 0 -o $RETVAL_B -ne 0 ]&&{
  

  
echo "one of your input is not int."
  

  
exit 1
  

  
}
  

  

  

  
[ $a -gt $b ]&&{
  

  
echo "$a>$b"
  

  
exit 0
  

  
}
  

  

  

  
[ $a -eq $b ]&&{
  

  
echo "$a=$b"
  

  
exit 0
  

  
}
  

  

  

  
[ $a -lt $b ]&&{
  

  
echo "$a$b"
  

  
else
  

  
    echo "$a
页: [1]
查看完整版本: shell编程19例