设为首页 收藏本站
查看: 984|回复: 0

shell编程19例

[复制链接]

尚未签到

发表于 2018-8-20 11:12:05 | 显示全部楼层 |阅读模式
  个人博客地址:
  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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554218-1-1.html 上篇帖子: shell中空格的用法 下篇帖子: shell脚本如何实现多彩进度条
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表