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

posted @ 2021-08-17 16:18  李成果  阅读(56)  评论(0编辑  收藏  举报