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]