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 脚本实 ...
随机推荐
- spring data jpa执行update和delete语句时报错处理
之前项目中使用spring data jpa时,遇到删除记录的需求时,主要利用spring data中自带的delete()方法处理,最近在dao层使用delete sql语句时报错,代码如下: @Q ...
- jvm代码热替换过程中异常
BTrace java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException 具体如下: 1. 信这个问题很多小伙伴已经遇到了,这是在你的jd ...
- 《PHP设计模式大全》系列分享专栏
<PHP设计模式大全>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第 ...
- 在CentOS7环境下部署weblogic集群
一)环境准备 服务器操作版本系统 CentOS7 weblogic版本包 weblogic1036_generic.jar(weblogic11g) JDK jdk-8u191-linux-x64.t ...
- NSIS 插件开发引发的思考
支持NSIS的DLL扩展编程通用语法结构 #include <windows.h> #include <stdio.h> #define FORCE_SWITCH " ...
- P5816 [CQOI2010]内部白点 题解
[题目链接] [解析] 好题. 拿到题目首先先看一下它的无解情况是怎么判断的. 然后很明显这个是不存在无解情况的. 因为它的黑点开始都是给定了的,可以理解为一个边界. 而新的变化的黑点不会往外扩张,那 ...
- Luogu P2051「AHOI2009」中国象棋
看见第一眼觉得是状压 \(\text{DP}\)?观察数据范围发现不可做 那按照最常规思路设状态试试? 设状态为\(dp[i][j]\)表示\(i*j\)的棋盘的方案数 好像转移不了欸 要不再来一维? ...
- C语言:#error命令,阻止程序编译
#error 指令用于在编译期间产生错误信息,并阻止程序的编译,其形式如下: #error error_message 例如,我们的程序针对 Linux 编写,不保证兼容 Windows,那么可以这样 ...
- 第 1 题:HTML 和 HTML5 有什么区别?
概念 HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准 文档类型声明 HTML <!DOCTYPE html PUBLIC "-//W3C//DTD HTML ...
- 解决linux下按退格键出现 ^? 的问题
处理办法:使用stty命令修改. stty命令语法 stty是linux下改变和打印终端设置的常用命令. stty(选项)(参数) -a:以容易阅读的方式打印当前的所有配置: -g:以stty可读方式 ...