批量生成随机字符串文件名

# 用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-脚本练习的更多相关文章

  1. shell及脚本4——shell script

    一.格式 1.1 开头 必须以 "# !/bin/bash"  开头,告诉系统这是一个bash shell脚本.注意#与!中间有空格. 二.语法 2.1 数值运算 可以用decla ...

  2. shell常用脚本

    shell常用脚本 author:headsen chen  2017-10-17 15:36:17 个人原创,转载请注明,否则依法追究法律责任 1,vim  name.grep.sh 2,cat   ...

  3. shell监控脚本

    序言: 前几天一好友问我服务器监控怎么做?你们公司的监控是怎么做的?有什么开源的监控软件推荐?常见的开源的监控软件当然首先推荐ZABBIX,分布式够强大,而且很多公司都在用,我问他具体什么需求,能监控 ...

  4. 4.Vim编辑器与Shell命令脚本

    第4章 Vim编辑器与Shell命令脚本 章节简述: 本章首先讲解如何使用Vim编辑器来编写.修改文档,然后通过逐个配置主机名称.系统网卡以及Yum软件仓库参数文件等实验,帮助读者加深Vim编辑器中诸 ...

  5. 【Telnet】使用Telnet协议连接到远程Shell执行脚本

    介绍 本文介绍如何通过Telnet协议连接到远程Shell,执行脚本,并获取执行结果: 相关文章: <[Jsch]使用SSH协议连接到远程Shell执行脚本>http://www.cnbl ...

  6. shell自动计算脚本

    shell自动计算脚本 #!/bin/bash echo $(($)) [root@bogon ~]# sh b.sh 123+123246 let用户声明这个操作是要计算,后者的效率更高 (expr ...

  7. Shell菜单脚本

    今天在这儿给大家分享一个我简单编写的Shell菜单脚本,傻瓜式的人机交互,人人都可以操作linux. #!/bin/sh #Shell菜单演示 function menu () { cat <& ...

  8. shell常见脚本30例

    shell常见脚本30例 author:headsen chen  2017-10-19  10:12:12 本文原素材出自网上,特此申明.有些地方加入我自己的改动 常见的30例shell脚本 1.用 ...

  9. 一篇关于Maven项目的jar包Shell启动脚本

    使用Maven作为项目jar包依赖的管理,常常会遇到命令行启动,笔者也是哥菜鸟,在做微服务,以及服务器端开发的过程中,常常会遇到项目的启动需要使用main方法,笔者潜心的研究了很多博客,发现大多写的都 ...

  10. Linux shell编写脚本部署pxe网络装机

    Linux shell编写脚本部署pxe网络装机 人工安装配置,Linux PXE无人值守网络装机  https://www.cnblogs.com/yuzly/p/10582254.html 脚本实 ...

随机推荐

  1. 【重学Java】可变参数

    可变参数 可变参数[应用] 可变参数介绍 可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了 方法的参数类型已经确定,个数不确定,我们可以使用可变参数 可变参数定义格式 修饰符 ...

  2. CentOS-Docker安装phpMyAdmin(MySQL的web客户端)

    注:phpMyAdmin是一款MySQL的web客户端,还是很直观且好用的,所以推荐给你~ 下载镜像 $ docker pull phpmyadmin/phpmyadmin 运行镜像 1.无指定固定数 ...

  3. vim编辑器使用方法(相关指令)

    1.跳到文本的最后一行:按"G",即"shift+g" 2.跳到最后一行的最后一个字符 : 先重复1的操作即按"G",之后按"$& ...

  4. XCTF simple-unpacked

    一.查壳 是UPX的壳,拖入IDA,发现很多函数无法反编译也无法查看 二.骚操作 将那个文件放入记事本,ctrl+F搜索flag. 找到了. 实际上,是需要专门的UPX脱壳工具或者手工来脱壳的,我目前 ...

  5. JS高阶函数的使用

    1.何为高阶函数呢? JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数.简单来说,就是对其他 ...

  6. mysql:insert replace

    在使用SQL语句进行数据表插入insert操作时,如果表中定义了主键,插入具有相同主键的记录会报错: Error Code: 1062. Duplicate entry 'XXXXX' for key ...

  7. 牛客OI测试赛1

    题目链接: https://www.nowcoder.com/acm/contest/181#question A.斐波拉契 求$f[n-1]*f[n+1]-f[n]^2$,$f[n]$为斐波拉契数列 ...

  8. 微信小程序云开发-云存储的应用-识别银行卡

    一.准备工作 1.创建云函数identify.自定义action=="2"的时候识别银行卡信息. 2.云函数identify中index.js代码 1 const cloud = ...

  9. MySQL检查与性能优化示例脚本

    最近在玩python,为了熟悉一下python,写了个mysql的检查与性能优化建议的脚本. 虽然,真的只能算是一个半成残次品.也拿出来现眼一下. 不过对于初学者来说,还是有一定的参考价值的.比如说如 ...

  10. spring @Primary-在spring中的使用(十九)

    一.@Primary 在spring 中使用注解,常使用@Autowired, 默认是根据类型Type来自动注入的.但有些特殊情况,对同一个接口,可能会有几种不同的实现类,而默认只会采取其中一种的情况 ...