Shell-15-脚本练习
批量生成随机字符串文件名
# 用for循环在 /test 目录下批量创建10个html文件,其中每个文件需要包含10个随机小写字符加固定字符串 alnk 
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191115
# qq: 1029612787
# version: v0.1.0
# 随机生成文件
#########################################
# 存放目录
path="/test/"
# 判断目录是否存在
[ -d "$path" ] || mkdir -p $path
# 循环创建文件
for i in `seq 10`; do
   file_name="`echo $((RANDOM))|sha512sum |sed 's/[0-9]//g'|cut -c 1-10`"
   touch $path${file_name}_alnk.html
done
批量创建特殊要求用户
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191115
# qq: 1029612787
# version: v0.1.0
# 批量创建系统用户
#########################################
# 用户名前缀
name="Alnk"
for i in `seq -w 01 10`; do
   pass=`echo $((RANDOM)) |sha256sum|cut -c 1-16`
   useradd ${name}${i} && echo ${pass} | passwd ${name}${i} --stdin &>/dev/null
   echo -e "${name}${i}\t\t\t${pass}" >>/tmp/user_info.txt
done
扫描网络存活主机
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191115
# qq: 1029612787
# version: v0.1.0
# 统计局域网内IP地址是否在线
#########################################
# 设置IP变量网络位
ip="10.0.0."
# () 中的命令会作为子shell运行,& 会将其置入后台运行,这样可以加快脚本执行速度
# wait 命令,会一直等到所有的子shell进程全部结束才退出脚本
for i in {1..255};do
    (
    ping $ip$i -c 2 &>/dev/null
    [ $? -eq 0 ] && echo "$ip$i is alive" || echo "$ip$i is died"
    ) &
done
wait
解决DOS攻击
# 写一个shell脚本,根据web日志或者IP的并发连接数,若段时间内PV达到100,则调用防火墙命令封掉IP
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191115
# qq: 1029612787
# version: v0.1.0
# 分析nginx日志,封掉恶意访问的IP
# 访问超过100次的
#########################################
file_name=$1
while true; do
    # 分析传入的日志文件,并在排序去重后追加到一个临时文件里
    awk '{print $1}' $1|grep -v grep |grep -v "^$"|sort|uniq -c >/tmp/tmp.log
    # 读取文件
    while read line; do
   	# 获取每个IP
   	ip=`echo $line |awk '{print $2}'`
   	# 获取访问次数
   	count=`echo $line|awk '{print $1}'`
   	# 如果访问次数超过100,并且没有在防火墙中封掉该IP
   	if [ $count -gt 100 ] && [ `iptables -L -n|grep -v grep|grep "$ip"` -lt 1]
     	then
       		# 启用防火墙直接封掉IP
       		iptables -I INPUT -s $ip -j DROP
       		# 做好封IP记录
       		echo "$line is dropped" >>/tmp/droplist_`date +%F`.log
   	fi
    done</tmp/tmp.log
# 每小时执行一次
    #exit
    sleep 3600
done
MySQL数据库分库备份
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191115
# qq: 1029612787
# version: v0.1.0
# 备份数据库分库备份
#########################################
# 定义备份的目录
DBPATH="/server/backup"
# 数据库账号
MYUSER="root"
# 数据库密码
MYPASS="root123"
# 数据库sock文件
SOCKET="/var/lib/mysql/mysql.sock"
# 定义登录数据库的命令
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
# 定义数据库备份命令
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
# 判断存储目录是否存在
[ ! -d "$DBPATH" ] && mkdir -p $DBPATH
for dbname in `$MYCMD -e "show databases;"| sed '1,2d' |egrep -v "mysql|schema"`; do
    $MYDUMP $dbname|gzip >$DBPATH/${dbname}_$(date +%F).sql.gz
done
mysql数据库分表备份
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191115
# qq: 1029612787
# version: v0.1.0
# 备份数据库分表备份
#########################################
# 定义备份的目录
DBPATH="/server/backup"
# 数据库账号
MYUSER="root"
# 数据库密码
MYPASS="root123"
# 数据库sock文件
SOCKET="/var/lib/mysql/mysql.sock"
# 定义登录数据库的命令
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
# 定义数据库备份命令
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
[ ! -d "$DBPATH" ] && mkdir -p $DBPATH
for dbname in `$MYCMD -e "show databases;"| sed '1,2d' |egrep -v "mysql|schema"`; do
    # 创建对应的目录
    mkdir $DBPATH/${dbname}_$(date +%F) -p
    # 开始分表备份
    for table in `$MYCMD -e "show tables from $dbname;"|sed '1d'`; do
        $MYDUMP $dbname $table|gzip >$DBPATH/${dbname}_$(date +%F)/${dbname}_${table}.sql.gz
    done
done
删选符合长度的单词
#循环打印长度不超过6的单词
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191115
# qq: 1029612787
# version: v0.1.0
# 循环打印长度不超过6的单词
#########################################
array=(I am oldboy teacher welcome to oldboy training class)
for i in `echo ${array[*]}`; do
    [ ${#i} -lt 6 ] && echo $i
done
mysql主从复制异常监控
开发一个守护进程脚本,每30秒监控一次mysql主从复制是否异常(包括不同步延迟),如果异常,则发短信并发邮件给管理员
思路:
判断主从复制是否异常,主要是检测如下参数对应的值
Slave_IO_Running: Yes				  # IO线程状态必须为yes
Slave_SQL_Running: Yes			  # SQL线程状态必须为yes
Seconds_Behind_Master: 0			# 和主库比较同步延迟的秒数,这个参数很重要
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# 检查数据库主从复制状态
#########################################
# 定义脚本存放路径
path=/server/scripts
# 邮件列表,以空格隔开
MAIL_GROUP="1029612787@qq.com lichengguo@joyany.com"
# 日志路径
LOG_FILE="/tmp/web_check.log"
# 数据库用户
USER=root
# 用户密码
PASSWORD=root123
# 端口
PORT=3306
# 登录数据库命令
MYSQLCMD="mysql -u$USER -p$PASSWORD -S /var/lib/mysql/mysql.sock"
# 可以忽略的主从复制错误号,如果碰到这些错误号,自动重启主从复制服务
error=(1008 1007 1062)
# 定义判断主从复制错误的函数
function JudgeError(){
    for((i=0;i<${#error[*]};i++));do
        if [ "$1" == "${error[$i]}" ]; then
            echo "MySQL slave errorno is $1,auto repairing it."
            # 自动修复
#            $MYSQLCMD -e "stop slave;set global sql_slave_skip_counter=1;start slave;"
        fi
    done
}
# 定义检查数据库主从复制状态的函数
function CheckDb(){
    status=($(awk -F ":" '/_Running|Last_Errno|_Behind/{print $NF}' slave.log))
    expr ${status[3]} + 1 &>/dev/null  # 这个是延迟状态值,用于进行判断是否为数字
    if [ $? -ne 0 ]; then  # 如果不为数字
        status[3]=300  # 赋值300,当数据库出现复制故障时,延迟这个状态值可能是NULL,非数字
    fi
    # 两个线程都为yes,并且延迟小于120秒,即认为复制状态是正常的
    if [ "${status[0]}" == "Yes" -a "${status[1]}" == "Yes" -a ${status[3]} -lt 120 ]; then
        echo "Mysql slave status is ok."
        return 0
    else
        echo "Mysql replcation is failed"
        JudgeError ${status[2]}  # 将错误号${status[2]}传入JudeError函数,判断是否可以自动修复
    fi
}
# 定义邮件函数
function MAIL(){
    local SUBJECT_CONTENT=$1
    for MAIL_USER in `echo $MAIL_GROUP`; do
        mail -s "$SUBJECT_CONTENT" $MAIL_USER <$LOG_FILE  # 发邮件
    done
}
# 定义发送报警信息函数
function SendMsg(){
    if [ $1 -ne 0 ]; then  # 传入$1,如果不为0,则表示复制有问题,这里的 $1 就是CheckDb里的返回值
        NOW_TIME=`date +"%Y-%m-%d %H:%M:%S"`  # 报警时间
        SUBJECT_CONTENT="mysql slave is error, ${NOW_TIME}"  # 报警主题
        echo -e "$SUBJECT_CONTENT" |tee $LOG_FILE  # 输出信息,并记录到日志
        MAIL $SUBJECT_CONTENT  # 发邮件报警, $SUBJECT_CONTENT 作为函数参数传给MAIL函数
    else
        echo "MySQL slave status is ok"
    fi
}
# 定义执行函数
function main(){
#    while true; do
        CheckDb
        SendMsg $?  # 传入第一个参数 $? 。即CheckDb的返回值
#        sleep 30
#    done
}
# 调用函数
main
比较整数的大小
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191115
# qq: 1029612787
# version: v0.1.0
# 比较整数大小
#########################################
a=$1
b=$2
# 判断传入的参数是否为2个
[ $# -ne 2 ] && {
    echo "请传入2个参数"
    exit 2
}
# 判断传入的参数是否为整数
expr $a + 10 &>/dev/null
status1=$?
expr $b + 10 &>/dev/null
status2=$?
[ $status1 -eq 0 -a $status2 -eq 0 ] || {
    echo "请输入两个整数"
    exit 3
}
#
[ $a -lt $b ] && {
    echo "$a < $b"
}
[ $a -eq $b ] && {
    echo "$a = $b"
}
[ $a -gt $b ] && {
    echo "$a > $b"
}
菜单自动化软件部署
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# 菜单自动化软件部署
#########################################
cat <<END
1.[ install nginx ]
2.[ install php ]
3.[ install mysql ]
END
read -p "Pls input num: " num
case $num in
    1)
        echo "install nginx..."
        ;;
    2)
        echo "install php..."
        ;;
    3)
        echo "install mysql..."
        ;;
    *)
        echo "请输入合适的编号"
esac
web以及mysql服务异常监测
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# web以及mysql服务异常监测
#########################################
# Nginx可以监控特定URL的返回值
if [ `ps -ef|grep -v grep|grep mysql|wc -l` -gt 0 ]; then
    echo "MySQL is Running."
else
    echo "MsSQL is Stopped"
    systemctl restart mysqld
fi
监控Memcached缓存服务
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# 监控Memcached缓存服务
#########################################
if [ `netstat -lntup|grep 11211|grep -v grep|wc -l` -lt 1 ]; then
    echo "Memcached Service is error."
    exit 1
fi
# 往Memcached缓存服务里面随便存入一对键值对,进行测试
printf "delete aaa\r\n"|nc 127.0.0.1 11211 &>/dev/null  # 删除缓存中存在的aaa键和对应的值
# 注意这里的0 0 4的含义
# 第一个0
# 第二个0 表示键值对在缓存中永不过期
# 4 表示存储的字节数,这里是4,那么必须存入4个字节,不然会报错
printf "set aaa 0 0 4\r\nxxxx\r\n"|nc 127.0.0.1 11211 &>/dev/null  # 添加新的键值对
Mem_values=`printf "get aaa\r\n"|nc 127.0.0.1 11211|grep aaa|wc -l` # 查看键值对
if [ $Mem_values -eq 1 ];then
    echo "Memcached status is OK!"
else
    echo "Memcached status is Bad!"
fi
实现入侵检测与告警
#监控web站点目录(/var/html/www)下的所有文件是否被恶意更改(文件内容被更改了),如果有则打印改动的文件名(发邮件),定时任务每3分钟执行一次
#思路:采用md5sum来实现
#1.建立测试数据
[root@zabbix ~]# mkdir /var/html/www -p
[root@zabbix ~]# cp -a /etc/a* /var/html/www/
[root@zabbix ~]# ls /var/html/www/
abrt  adjtime  aliases  aliases.db  alternatives  anacrontab  asound.conf  audisp  audit
#2.建立初始的文件指纹库
[root@zabbix ~]# find /var/html/www/ -type f |xargs md5sum >/opt/zhiwen.db.ori
[root@zabbix ~]# tail /opt/zhiwen.db.ori
f5fab6a80b0a807af00dab52ddd5a11a  /var/html/www/aliases.db
8241db83d5edf01c71734e41e383e205  /var/html/www/anacrontab
1c9cf478bb79baae4939470b606609d0  /var/html/www/asound.conf
4ca8c26bab8fa3119dc0e179970ec5eb  /var/html/www/audisp/audispd.conf
199eaa1e43fa9139f0910bdb64fd219e  /var/html/www/audisp/plugins.d/af_unix.conf
57421191efe78160bd7e085de99bf5cd  /var/html/www/audisp/plugins.d/syslog.conf
45dc8b93a8b644d96197dc87b7b2b392  /var/html/www/audit/audit-stop.rules
29f4c6cd67a4ba11395a134cf7538dbd  /var/html/www/audit/auditd.conf
36ffbc8f4c0800b1b8fbd35191782d82  /var/html/www/audit/rules.d/audit.rules
f1c2a2ef86e5db325cd2738e4aa7df2c  /var/html/www/audit/audit.rules
#3.建立初始的文件库
[root@zabbix ~]# find /var/html/www/ -type f  >/opt/wenjian.db.ori
[root@zabbix ~]# tail /opt/wenjian.db.ori
/var/html/www/aliases.db
/var/html/www/anacrontab
/var/html/www/asound.conf
/var/html/www/audisp/audispd.conf
/var/html/www/audisp/plugins.d/af_unix.conf
/var/html/www/audisp/plugins.d/syslog.conf
/var/html/www/audit/audit-stop.rules
/var/html/www/audit/auditd.conf
/var/html/www/audit/rules.d/audit.rules
/var/html/www/audit/audit.rules
#检测文件内容变化
[root@zabbix ~]# echo "==========================" >>/var/html/www/aliases.db    # 更改文件
[root@zabbix ~]# export LANG=en                                                              # 调整字符集
[root@zabbix ~]# md5sum -c --quiet /opt/zhiwen.db.ori 					# 检查所有文件内容是否变化
/var/html/www/aliases.db: FAILED								# 变化的会打印出来
md5sum: WARNING: 1 computed checksum did NOT match			# 综合提示
#检查文件是否有新增或者删除
[root@zabbix ~]# echo "++++" >/var/html/www/test.txt					#模拟新增
[root@zabbix ~]# find /var/html/www/ -type f >/opt/wenjian.db_curr.ori 		# 再次获取当前所有的文件
[root@zabbix ~]# diff /opt/wenjian.db*								# 对比新老文件
21d20
< /var/html/www/test.txt											#新增加的文件
# 在脚本开发前,要先建立初始的指纹库和文件库
[root@zabbix ~]# find /var/html/www/ -type f |xargs md5sum >/opt/zhiwen.db.ori
[root@zabbix ~]# find /var/html/www/ -type f  >/opt/wenjian.db.ori
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# 开发脚本实现入侵检测与告警
#########################################
RETVAL=0  # 状态初始化
export LANG=en  # 调整字符集
CHECK_DIR=/var/html/www  # 定义要监测的站点目录
[ -e $CHECK_DIR ] || exit 1  # 如果目录不存在则退出脚本
ZhiWenDBOri="/opt/zhiwen.db.ori"  # 定义原始指纹库路径
FileCountDBOri="/opt/wenjian.db.ori"  # 定义原始文件库路径
ErrLog="/opt/err.log"  # 定义检测后的内容日志
[ -e $ZhiWenDBOri ]  || exit 1  # 如果原始的指纹库不存在则退出
[ -e $FileCountDBOri ]  || exit 1  # 如果原始的文件库不存在则退出
# 检测
echo "[root@zabbix ~]# md5sum -c --quiet /opt/zhiwen.db.ori" >$ErrLog  # 打印检测命令
md5sum -c --quiet /opt/zhiwen.db.ori &>>$ErrLog  # 实际执行命令
RETVAL=$?  # 收集返回值
find $CHECK_DIR -type f >/opt/wenjian.db_curr.ori  # 实际执行检测命令,获取最新文件数量等
echo "[root@zabbix ~]# diff /opt/wenjian.db*" &>>$ErrLog  # 打印检测命令
diff /opt/wenjian.db* &>>$ErrLog
if [ $RETVAL -ne 0 -o `diff /opt/wenjian.db*|wc -l` -ne 0 ];then  # 如果返回值不为0,或者对比结果行数不为0,则进入判断
    echo "发送邮件"
    # mail -s "`uname -n` $(date +%F) err" 1029612787@qq.com <$ErrLog
else
    echo "OK"
# echo "Sites dir is ok"| mail -s "`uname -n` $(date +%F)" 1029612787@qq.com
fi
#在企业中一般什么文件需要做指纹验证呢?
#系统命令、用户文件、配置文件、启动文件等重要文件
#在实际工作中应对所有的用户操作做日志审计
Rsync服务启动脚本
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# 开发Rsync服务启动脚本
#########################################
if [ $# -ne 1 ];then
    echo "usage:$0 {start|stop|restart}"
    exit 1
fi
if [ "$1" = "start" ];then
    rsync --daemon
    sleep 2
    if [ `netstat -lntup|grep rsync|wc -l` -ge 1 ];then
        echo "rsyncd is started"
        exit 0
    fi
elif [ "$1" = "stop" ];then
    kill -9 `ps -ef|grep -v grep|grep  rsync|awk '{print $2}'`
    rm -rf /var/run/rsyncd.pid
    sleep 2
    if [ `netstat -lntup|grep rsync|wc -l` -eq 0 ];then
        echo "rsyncd is stopped"
        exit 0
    fi
elif [ "$1" = "restart" ];then
    kill -9 `ps -ef|grep -v grep|grep  rsync|awk '{print $2}'` &>/dev/null
    rm -rf /var/run/rsyncd.pid
    sleep 2
    killpro=`netstat -lntup|grep rsync|wc -l`
    rsync --daemon
    sleep 2
    startpro=`netstat -lntup|grep rsync|wc -l`
    if [ $killpro -eq 0 -a $startpro -ge 1 ];then
        echo "rsyncd is restarted"
        exit 0
    fi
fi
开发MySQL多实例启动脚本
#已知MySQL多实例启动命令为:mysqld_safe --defaults-file=/data/3306/my.cnf &
#停止命令为:mysqladmin -uroot -proot123 -S /data/3306/mysql.sock shutdown
#要求:用函数、case语句、if语句等实现
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# MySQL多实例启动脚本
#########################################
Port=3306
MysqlUser="root"
MysqlPass="root123"
CmdPath="/application/mysql/bin"
# startup function
start(){
    if [ `netstat -lnt|grep "$Port"|wc -l` -eq 0 ];then
        printf "Starting MySQL...\n"
        ${CmdPath}/mysqld_safe --defaults-file=/data/${Port}/my.cnf &>/dev/null
    else
        echo "MySQL is running..."
    fi
}
# stop function
stop(){
    if [ ! `netstat -lnt|grep "$Port"|wc -l` -eq 0 ];then
        echo "Stopping MySQL..."
        ${CmdPath}/mysqladmin -u${MysqlUser} -p${MysqlPass} -S /data/${Port}/mysql.sock shutdown
    else
        echo "MySQL is stopped..."
    fi
}
# restart function
restart(){
    echo "Restarting MySQl..."
    stop
    sleep 2
    start
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    *)
        echo "Usage:$0 {start|stop|restart}"
esac
开发学生实践抓抓阄脚本
#需求:
#1.名额有限,仅限3人
#2.输入想去的英文名字全拼,产生随机数(01~99),数字越大越有机会中签,对于前面已经中的数字,下次不能再出现
#3.屏幕输出信息,并将名字和数字记录到文件里,程序不退出,继续等待别的学生输入
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# 学生实践抓抓阄脚本
#########################################
FileLog="/tmp/zhuajiu.log"  # 定义抓阄结果日志
[ -f "$FileLog" ] || touch $FileLog  # 如果日志不存在就创建一个空文件
Check_Name(){
    while true;do
        read -p "Pls input you English name: " name
        if [ "$name" = "quit" ];then  # 输入quit退出脚本
            exit 0
        elif [ -n "$name" -a "$(grep -w "$name" $FileLog|wc -l)" -eq 0 ];then  # 名字不为空,且不重名
            flag=1  # 标志位
            break
        else
            echo "The name your input is null or alrad exist"
            continue
        fi
    done
}
Product_RandomNum(){
    if [ $flag -eq 1 ];then  # 如果名字不为空,且不重名,则进入判断
        while true;do
            RandomNum=$(expr $RANDOM % 99 + 1)  # 生成1~99的随机数
            if [ `grep -w "$RandomNum" $FileLog|wc -l` -ne 1 ];then  # 如果随机数没被人抽到,则进入到判断
                echo "${name},your num is ${RandomNum}" |tee -a $FileLog  # 屏幕和日志文件双输出
                flag=0  # 标志位
            else
                flag=1  # 标志位,随机数重复了,重新调用函数生成随机数
            fi
            if [ $flag -eq 1 ];then
                Product_RandomNum  # 随机数重复了,就重新生成函数
            else
                Check_Name
            fi
        done
    fi
}
main(){
    Check_Name
    Product_RandomNum
}
main
破解RANDOM随机数
#1 2 3 5 的随机数如下
[root@zabbix ~]# echo "1"|md5sum |cut -c1-8
b026324c
26ab0db9
6d7fce9f
1dcca233
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# 破解RANDOM随机数
#########################################
# 字符串数组 1 2 3 5
array=(
b026324c
b82d48a3
b67624e7
6a7c77bc
)
random_log="/tmp/random.log"  # 存放破解的结果
md5_file="/tmp/md5_file"  # 生成md5 和数字对应的密码本,这样测试速度快
# 密码本不存在就创建密码本
[ -f $md5_file ] || {
    touch $md5_file
    for i in {0..32767};do
        echo  "$i --- `echo $i|md5sum |cut -c1-8`"  >>$md5_file
    done
}
# 匹配md5码,并输出结果
for i in `echo ${array[*]}`;do
    grep $i $md5_file | tee -a $random_log
done
批量检查多个网址是否正常
#需求
#1.shell数组实现
#2.每10s做一次所有检测
#3.待检测地址
#www.baidu.com
#www.taobao.com
#www.qq.com
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# 批量检查多个网址是否正常
#########################################
. /etc/init.d/functions  # 调用系统函数
check_count=0  # 执行次数初始化
# 定义检查的数组
url_list=(
www.baidu.com
www.taobao.com
www.qq.com
)
# 定义3 2 1 倒计时函数
waiting(){
    echo "3秒后,执行检查 URL 操作"
    for i in `seq 1 3`;do
        echo -n "."
        sleep 1
    done
    echo
}
# 定义检查 URL 的函数
check_url(){
    waiting
    for i in `echo ${url_list[*]}`;do
        wget -o /dev/null -T 3 --tries=1 --spider $i &>/dev/null
        if [ $? -eq 0 ];then
            action "$i" /bin/true  # 优雅显示
        else
            action "$i" /bin/false
        fi
    done
    let check_count++
}
# 执行函数
main(){
    while true;do
        echo "------------------------------check count:${check_count}--------------------------------"
        check_url
        sleep 10
    done
}
main
单词以及字符去重排序
#the squid project providesa support squid installations . Please infomation , by oldboy training . number of rcsources to assist users design , implement and browse the documentation and support sections for more
#需求
#1.按单词出现的频率降序排序
##2.按字母出现的频率降序排序
#需求1解决办法
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# 单词以及字符去重排序
#########################################
# 方法1
[root@zabbix ~]# awk -F "[,. ]+" '{for(i=1;i<=NF;i++)array[$i]++}END{for(key in array)print array[key],key|"sort -nr"}' test.txt
2 the
2 support
2 squid
2 and
1 users
# 方法2
[root@zabbix ~]# tr "[ ,.]" "\n" <test.txt |grep -v "^$"|sort|uniq -c|sort -rn
      2 the
      2 support
      2 squid
      2 and
      1 users
#需求2解决办法
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191119
# qq: 1029612787
# version: v0.1.0
# 单词以及字符去重排序
#########################################
# 方法1
[root@zabbix ~]# grep -o [a-Z] test.txt |sort|uniq -c|sort -nr
     19 s
     18 o
     16 e
   ...
#方法2
[root@zabbix ~]# grep -o "[^ ]" test.txt |sort|uniq -c |sort -rn -k1
     19 s
     18 o
     16 e
     15 t
     14 n
     ...
#方法3
[root@zabbix ~]# tr "[ |,|.]" "\n" <test.txt |awk -F "" '{for(i=1;i<=NF;i++)array[$i]++}END{for(key in array)print array[key],key|"sort -nr"}'
19 s
18 o
16 e
...
编写正方形或长方形图形
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191120
# qq: 1029612787
# version: v0.1.0
# 编写正方形或长方形图形
#########################################
read -p "Pls enter a number: " line
for i in `seq $line`;do
    for j in `seq $line`;do
        echo -n "*"
    done
    echo
done
编写等腰三角形字符
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191120
# qq: 1029612787
# version: v0.1.0
# 等腰三角形字符
#########################################
read -p "Pls enter a number: " line
for i in `seq $line`;do
    for j in $(seq `expr $line - $i`);do
        echo -n " "
    done
    for h in $(seq `expr $i \* 2 - 1`);do
        echo -n "*"
    done
    echo
done
统计分析nginx日志中ip访问数量
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191120
# qq: 1029612787
# version: v0.1.0
# 统计分析nginx日志中ip访问数量
#########################################
# nginx日志文件所在路径
log_file='/var/log/nginx/access.log'
# 统计昨天的IP访问数量
count="$(grep  `date -d "1 day ago" +"%d/%b/%Y"` ${log_file}|awk '{print $1}'|sort|uniq -c|sort -rh)"
# printf "$count\n"
# 发送邮件
# 先配置邮件服务器
# vim /etc/mail.rc
# set from=13142209450@163.com smtp=smtp.163.com
# set smtp-auth-user=13142209450@163.com smtp-auth-password=abc123 smtp-auth=login
# systemctl restart postfix.service
printf "${count}\n"|mail -s "`date -d '1 day ago' +'%d/%b/%Y'`-nginx-log-分析结果" 1029612787@qq.com
统计linux服务器的一些信息
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191120
# qq: 1029612787
# version: v0.1.0
# 统计linux服务器的一些信息
#########################################
# 建议添加到 ~/.bash_profile 文件里,这样每次连接linux服务器都能看到相应的信息
echo ""
echo "====================== 磁盘使用率 ======================================="
df -h
echo ""
echo "====================== 内存使用率 ======================================="
free -h
echo ""
echo ""
history命令在脚本中不起作用问题
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191120
# qq: 1029612787
# version: v0.1.0
# history命令在脚本中不起作用问题
#########################################
# 加上这两行即可解决
HISTFILE=~/.bash_history
set -o history
history |awk '{print $2}'|sort|uniq -c|sort -rh|head -10
expr判断文件扩展名是否合法
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191120
# qq: 1029612787
# version: v0.1.0
# expr判断文件扩展名是否合法
#########################################
if expr "$1" : ".*\.pub" &>/dev/null; then
    echo "合法"
else
    echo "不合法"
fi
从ftp服务器备份数据到本地
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20191120
# qq: 1029612787
# version: v0.1.0
# 备份ftp服务器文件
#########################################
# 定义时间
d=`date +%Y%m%d`  # 获取当前时间
d7=`date -d -7day +%Y%m%d`  # 获取7天以前的时间
# 下载ftp服务器的数据到/tmp目录下
cd /tmp
wget -r -l 0 -c ftp://192.168.3.28/* --ftp-user=backup --ftp-password=Admin123
#
if [ -d "192.168.3.28" ];then  # 如果目录存在则进入到判断
    mv 192.168.3.28 F_share
    if [ -d "/home/bak/finance" ];then  # 备份ftp数据目录
        tar -zcPf /home/bak/finance/$d.tar.gz /tmp/F_share
    else
        mkdir -p /home/bak/finance
        tar -zcPf /home/bak/finance/$d.tar.gz /tmp/F_share
    fi
    rm -rf /tmp/F_share  # 清理临时数据
    rm -rf /home/bak/finance/$d7.tar.gz  # 清理7天前的数据
    echo "备份完成"
else
    echo "ftp下载失败"
fi
抽奖脚本
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20180205
# qq: 1029612787
# version: V0.2.0
# 抽奖小程序
# 本版本更新如下(V1.2):
# 1.使用 select 优化程序框架
# 2.使用函数优化代码
# 3.可以使用txt文本导入抽奖人员名单
# 本版本更新(V2.0)
# 1.中奖语句bug修复
# 2.不可再重复抽奖
#########################################
# 定义抽奖人员名单,如果没有导入名单,此处为默认名单
array=(王浩 谢云生 黄科杨 何星宇 张宸兵 邓培林 刘桃 杨沛东 楚齐文 咸鱼 杨东 黄庭辉 郑少文 师靖 肖洪森)
# 导入抽奖人员名单
if [ $# -eq 1 ];then
    array=()
    while read line;do
        array=(${array[@]} $line)
    done <$1
fi
# 多少人参与抽奖,此处的值就为多少减去1
sum=14
# 定义保存中奖名单文件
log_file=log.txt
# debug
# 如果log.txt日志文件存在则删除
if [ -e "log.txt" ];then
    rm -f $log_file
fi
# 中奖名单
zjmd=()
# 抽奖的主函数
chou(){
    echo -e "现在开始抽取${number}...\n"
    i=0
    while [ $i -lt $count ];do
   # 此处是随机抽取中奖人员语句
   a=`seq 0 $sum|shuf|head -1`
   win=${array[a]}
   # 判断该人员是否已经中奖,不可重复参与抽奖
   # 此处是判断一个元素是否存在于数组中
   # 这个是判断一个元素不存在于一个数组中
   if [[ ${zjmd[@]/$win/} == ${zjmd[@]} ]];then
       echo "${number}中奖名单:${win}">>$log_file
       echo "${number}中奖名单:${win}"
       zjmd=(${zjmd[@]} $win)
       let i++
   fi
    done
    echo ''
    break
}
# 查看中奖名单的函数
mingdan(){
    echo ''
    if [ -e $log_file ];then
   echo  "中奖名单如下:"
        cat $log_file
    else
        echo "还没抽过奖哦"
    fi
    echo ''
    break
}
# select语句,使用以下的提示符
PS3="请输入抽奖编号:"
# 主循环
while true;do
    select number in 一等奖 二等奖 三等奖 中奖名单 退出抽奖系统;do
   case $number in
       一等奖)
      count=1  #中奖名额控制
      chou
      ;;
       二等奖)
      count=2  #中奖名额控制
      chou
      ;;
       三等奖)
      count=3  #中奖名额控制
      chou
      ;;
       中奖名单)
      mingdan
      ;;
       退出抽奖系统)
      echo -e "退出抽奖系统!\n"
      exit
      ;;
       *)
      echo -e "输入的编号有误,请重新输入编号!\n"
      break
   esac
    done
done
nagios监控cpu的使用率的插件
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20180129
# qq: 1029612787
# version: V0.1.0
# 用于nagios监控cpu的使用率的插件
#########################################
# nagios监控的各种状态码
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
# 设置警告和严重的阀值
# 建议设置为空闲率小于10%时严重告警,大于10%且小于20%时普通告警
cpu_warn=$2
cpu_critical=$4
# 获取CPU当前空闲率
cpu_free=`top -b -n 3 | grep Cpu | awk 'NR==3 {print $5}' | cut -d"%" -f1`
# 判断条件
# 当cpu_free值大于cpu_warn值时则正常
if (( `echo "$cpu_free > $cpu_warn"|bc` ));then
    # 用于比较小数大小
    echo "CPU Free is OK - CPUfree=$cpu_free|CPUfree=$cpu_free;$cpu_warn;$cpu_critical;0"
    exit 0
elif (( `echo "$cpu_free < $cpu_warn"|bc` )) && (( `echo "$cpu_free > $cpu_critical"|bc` ));then
    echo "CPU Free is WARNING - CPUfree=$cpu_free |cpufree=$cpu_free;$cpu_warn;$cpu_critical;0"
    exit 1
else
    echo "CPU Free is CRITICAL - CPUfree=$cpu_free|cpufree=$cpu_free;$cpu_warn;$cpu_critical;0"
    exit 2
fi
# 脚本执行的方法示例如下
# 当空闲率大于10%小于20%普通告警,当空闲率小于10%严重告警
# ./monitor_cpu.sh -w 20 -c 10
nagios监控内存的使用率的插件
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20180130
# qq: 1029612787
# version: V0.1.0
# nagios监控内存的使用率的插件
#########################################
# nagios监控的各种状态码
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
#设置普通警告和严重的阀值
mem_warn=$2
mem_critical=$4
# 获取内存相关数据,单位为MB
mem_total=`free -m|awk 'NR==2 {print $2}'`
mem_used=`free -m|awk 'NR==3 {print $3}'`
mem_freed=`free -m|awk 'NR==3 {print $4}'`
# 计算出使用率的百分比,并且忽略小数部分
mem_use_percentage=`echo "scale = 3; ($mem_used / $mem_total) * 100" | bc|cut -d. -f1`
# 条件判断
if (( $mem_use_percentage < $mem_warn ));then
    echo "MEMORY is OK - Mem_Free=${mem_freed}MB |Free=${mem_freed}MB;${mem_warn};${mem_critical};0;${mem_total}MB"
    exit 0
elif (( $mem_use_percentage > $mem_warn )) && (( $mem_use_percentage < $mem_critical ));then
    echo "MEMORY is WARNING - Mem_free=${mem_freed}MB |Free=${mem_freed}MB;${mem_warn};${mem_critical};0;${mem_total}MB"
    exit 1
elif (( $mem_use_percentage > $mem_critical ));then
    echo "MEMORY is CRITCAL - Mem_free=${mem_freed}MB |Free=${mem_freed}MB;${mem_warn};${mem_critical};0;${mem_total}MB"
    exit 2
fi
# 脚本执行的方法示例如下
# 当使用率达到80%普通告警,90%以上严重告警
# ./monitor_mem.sh -w 80 -c 90
nagios监控主机是否存活插件
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20180130
# qq: 1029612787
# version: V0.1.0
# nagios监控主机是否存活插件
#########################################
# nagios监控的各种状态码
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
# 需要检测的主机IP
IP_ADDR=$1
# ping主机
ping -c 2 ${IP_ADDR} >/dev/null
#判断
if (( $? == 0 ));then
    echo "OK! ${IP_ADDR}"
    exit 0
else
    echo "CRITICAL! ${IP_ADDR}"
    exit 2
fi
# 脚本执行的方法示例如下
# ./monitor_host.sh 127.0.0.1
nagios监控253短信剩余条数
#!/bin/bash
#########################################
# Auth: Alnk
# date: 20180130
# qq: 1029612787
# version: V0.1.0
# nagios监控253短信剩余条数
#########################################
# nagios监控的各种状态码
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
# 设置短信条数剩余告警阀值
warn=4000
# 获取253短信剩余条数
qa=`curl -s 'http://222.73.117.158/msg/QueryBalance?account=xxxx&pswd=xxxx'|awk -F, 'NR==2 {print $2}'`
# 判断,如果剩余短信条数小于设置的阀值则告警
if (( $qa > $warn ));then
    echo "message is OK! Available=$qa|quota=$qa;$warn;0"
    exit 0
else
    echo " message is WARNING! Available=$qa|quota=$qa;$warn;0"
    exit 1
fi
# 脚本使用示例如下
# ./monitor_253.sh
												
											Shell-15-脚本练习的更多相关文章
- shell及脚本4——shell script
		
一.格式 1.1 开头 必须以 "# !/bin/bash" 开头,告诉系统这是一个bash shell脚本.注意#与!中间有空格. 二.语法 2.1 数值运算 可以用decla ...
 - shell常用脚本
		
shell常用脚本 author:headsen chen 2017-10-17 15:36:17 个人原创,转载请注明,否则依法追究法律责任 1,vim name.grep.sh 2,cat ...
 - shell监控脚本
		
序言: 前几天一好友问我服务器监控怎么做?你们公司的监控是怎么做的?有什么开源的监控软件推荐?常见的开源的监控软件当然首先推荐ZABBIX,分布式够强大,而且很多公司都在用,我问他具体什么需求,能监控 ...
 - 4.Vim编辑器与Shell命令脚本
		
第4章 Vim编辑器与Shell命令脚本 章节简述: 本章首先讲解如何使用Vim编辑器来编写.修改文档,然后通过逐个配置主机名称.系统网卡以及Yum软件仓库参数文件等实验,帮助读者加深Vim编辑器中诸 ...
 - 【Telnet】使用Telnet协议连接到远程Shell执行脚本
		
介绍 本文介绍如何通过Telnet协议连接到远程Shell,执行脚本,并获取执行结果: 相关文章: <[Jsch]使用SSH协议连接到远程Shell执行脚本>http://www.cnbl ...
 - shell自动计算脚本
		
shell自动计算脚本 #!/bin/bash echo $(($)) [root@bogon ~]# sh b.sh 123+123246 let用户声明这个操作是要计算,后者的效率更高 (expr ...
 - Shell菜单脚本
		
今天在这儿给大家分享一个我简单编写的Shell菜单脚本,傻瓜式的人机交互,人人都可以操作linux. #!/bin/sh #Shell菜单演示 function menu () { cat <& ...
 - shell常见脚本30例
		
shell常见脚本30例 author:headsen chen 2017-10-19 10:12:12 本文原素材出自网上,特此申明.有些地方加入我自己的改动 常见的30例shell脚本 1.用 ...
 - 一篇关于Maven项目的jar包Shell启动脚本
		
使用Maven作为项目jar包依赖的管理,常常会遇到命令行启动,笔者也是哥菜鸟,在做微服务,以及服务器端开发的过程中,常常会遇到项目的启动需要使用main方法,笔者潜心的研究了很多博客,发现大多写的都 ...
 - Linux shell编写脚本部署pxe网络装机
		
Linux shell编写脚本部署pxe网络装机 人工安装配置,Linux PXE无人值守网络装机 https://www.cnblogs.com/yuzly/p/10582254.html 脚本实 ...
 
随机推荐
- Gerrit GitLab GitHub的几点不同
			
代码评审的方式不一样 GitHub是基于Pull Request 进行代码评审; GitLab是基于Merge Request 进行代码评审; Gerrit是基于Change Request 进行代码 ...
 - SpringBoot缓存管理(二) 整合Redis缓存实现
			
SpringBoot支持的缓存组件 在SpringBoot中,数据的缓存管理存储依赖于Spring框架中cache相关的org.springframework.cache.Cache和org.spri ...
 - Java:Java中equlas和==的区别
			
== 比较的是栈内存的地址值,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. 基本数据类型如:byte,short,char,int,long,float,do ...
 - buu 红帽杯 XX
			
一.拖入ida,静态分析 __int64 __fastcall sub_7FF65D4511A0(__int64 a1, __int64 a2) { signed __int64 v2; // rbx ...
 - 通过原生js实现数据的双向绑定
			
通过js实现数据的双向绑定 : Object.defineProperty了解 语法: Object.defineProperty(obj, prop, descriptor) obj 要定义属性的对 ...
 - Java之注解与反射
			
Java之注解与反射 注解(Annotation)简介 注解(Annotation)是从JDK5.0引入的新技术 Annotation作用:注解(Annotation)可以被其他程序如编译器等读取 A ...
 - 关于 junit4 90% 的人都不知道的特性,详解 junitperf 的实现原理
			
前言 上一节介绍了 https://github.com/houbb/junitperf 的入门使用. 这一节我们从源码的角度,剖析一下其实现方式. 性能测试该怎么做? Junit Rules jun ...
 - 未开通js之前的纯css网页主题
			
本主题修改自其他大佬:Rocket1184/MaterialCnblogs: Material Theme for cnblogs.com (github.com) 只需在博客后台选择"禁用 ...
 - Innodb 锁的介绍
			
如下博文是参考如下博文内容,再加整理. http://blog.chinaunix.net/uid-24111901-id-2627857.html http://blog.csdn.net/wang ...
 - pip3 pip 安装包 临时更换镜像地址
			
在使用pip3或者pip安装某些第三方包的时候,可能会遇到网络原因导致的安装失败. 可以在安装第三方包的时候临时指定镜像地址. 命令: pip3 install 库名 -i 镜像地址 例如:# pip ...