写点什么

【脚本小子狂喜】日常实用脚本推荐

用户头像
Machine Gun
关注
发布于: 2021 年 06 月 05 日

 


开篇小叙:

脚本写的好,下班下得早!咱们的日常工作除了编写程序代码,还不可避免地需要处理相关的测试和验证工作。

例如,访问某个网站一直不通,需要确定此地址是否可访问,服务器返回什么,进而确定问题在于什么。完成这个任务,如果一味希望采用编译型语言来编写这样的代码,实践中的时间和精力是不够的,这个时候就需要发挥脚本的神奇作用!

好不夸张的说,能否写出高效实用的脚本代码,直接影响着一个程序员的性福生活[下班时间]。下面整理 13 个实用的脚本,需要的时候改改直接用,建议收藏!

1、list_sys_status.sh

显示系统使用的以下信息:主机名、IP 地址、子网掩码、网关、DNS 服务器 IP 地址信息

#!/bin/bashIP=`ifconfig eth0 | head -2 | tail -1 | awk '{print $2}' | awk -F":" '{print $2}'`ZW=` ifconfig eth0 | head -2 | tail -1 | awk '{print $3}' | awk -F":" '{print $2}'`GW=`route -n | tail -1 | awk '{print $2}'`HN=`hostname`DNS=`head -1 /etc/resolv.conf | awk '{print $2}'`echo '此机IP地址是' $IPecho '此机子网掩码是' $ZWecho '此机网关是' $GWecho '此机主机名是' $HNecho '此机DNS是' $DNS+wx:machinegunjoe666 领取资料
复制代码


2、mysqlbak.sh 备份数据库目录脚本

#!/bin/bashDAY=`date +%Y%m%d`SIZE=`du -sh /var/lib/mysql`echo "Date: $DAY" >> /tmp/dbinfo.txtecho "Data Size: $SIZE" >> /tmp/dbinfo.txtcd /opt/dbbak &> /dev/null || mkdir /opt/dbbaktar zcf /opt/dbbak/mysqlbak-${DAY}.tar.gz /var/lib/mysql /tmp/dbinfo.txt &> /dev/nullrm -f /tmp/dbinfo.txt
crontab-e55 23 */3 * * /opt/dbbak/dbbak.sh
复制代码


3、每周日半夜 23 点半,对数据库服务器上的 webdb 库做完整备份

每备份文件保存到系统的/mysqlbak 目录里用系统日期做备份文件名 webdb-YYYY-mm-dd.sql 每次完整备份后都生成新的 binlog 日志把当前所有的 binlog 日志备份到/mysqlbinlog 目录下

#mkdir /mysqlbak #mkdir /mysqlbinlog#service mysqld startcd /shell#vi webdb.sh#!/bin/bashday=`date +%F`mysqldump -hlocalhost -uroot -p123 webdb > /mysqlbak/webdb-${day}.sqlmysql -hlocalhost -uroot -p -e "flush logs"tar zcf /mysqlbinlog.tar.gz /var/lib/mysql/mysqld-bin.0*#chmod +x webdb.sh #crontab -e30 23 * * 7 /shell/webdb.sh
复制代码


4、very.ser.sh(检查任意一个服务的运行状态)

只检查服务 vsftpd httpd sshd crond、mysql 中任意一个服务的状态如果不是这 5 个中的服务,就提示用户能够检查的服务名并退出脚本如果服务是运行着的就输出 "服务名 is running"如果服务没有运行就启动服务

方法1:使用read写脚本#!/bin/bashread -p "请输入你的服务名:" serviceif [ $service != 'crond' -a $service != 'httpd' -a $service != 'sshd' -a $service != 'mysqld' -a $service != 'vsftpd' ];thenecho "只能够检查'vsftpd,httpd,crond,mysqld,sshd"exit 5fiservice $service status &> /dev/null
if [ $? -eq 0 ];thhenecho "服务在线"elseservice $service startfi

方法2:使用位置变量来写脚本if [ -z $1 ];thenecho "You mast specify a servername!"echo "Usage: `basename$0` servername"exit 2fiif [ $1 == "crond" ] || [ $1 == "mysql" ] || [ $1 == "sshd" ] || [ $1 == "httpd" ] || [ $1 == "vsftpd" ];thenservice $1 status &> /dev/nullif [ $? -eq 0 ];thenecho "$1 is running"elseservice $1 startfielseecho "Usage:`basename $0` server name"echo "But only check for vsftpd httpd sshd crond mysqld" && exit2fi
复制代码


5、pc_noline.sh

输出 192.168.1.0/24 网段内在线主机的 ip 地址统计不在线主机的台数,并把不在线主机的 ip 地址和不在线时的时间保存到/tmp/ip.txt 文件里

#!/bin/baship=192.168.1.j=0for i in `seq 10 12`doping -c 3 $ip$i &> /dev/nullif [ $? -eq 0 ];thenecho 在线的主机有:$ip$ielselet j++echo $ip$i >> /tmp/ip.txtdate >> /tmp/ip.txtfidoneecho 不在线的主机台数有 $j
复制代码


6、一个简单的网站论坛测试脚本

用交互式的输入方法实现自动登录论坛数据库,修改用户密码

[root@test1 scripts]# vim input.sh
#!/bin/bash
End=ucenter_membersMYsql=/home/lnmp/mysql/bin/mysql
read -p "Enter a website directory : " webdirWebPath=/home/WebSer/$webdir/configecho $WebPath
read -p "Enter dbuser name : " dbuserecho $dbuser
read -sp "Enter dbuser password : " dbpass
read -p "Enter db name : " dbnameecho $dbname
read -p "Enter db tablepre : " dbtablepreecho $dbtablepre
Globalphp=`grep "tablepre*" $WebPath/config_global.php |cut -d "'" -f8`Ucenterphp=`grep "UC_DBTABLEPRE*" $WebPath/config_ucenter.php |cut -d '.' -f2 | awk -F "'" '{print $1}'`
if [ $dbtablepre == $Globalphp ] && [ $dbtablepre == $Ucenterphp ];then
     Start=$dbtablepre     Pre=`echo $Start$End`
     read -p "Enter you name : " userset     echo $userset
     Result=`$MYsql -u$dbuser -p$dbpass $dbname -e "select username from $Pre where username='$userset'\G"|cut -d ' ' -f2|tail -1`     echo $Result     if [ $userset == $Result ];then           read -p "Enter your password : " userpass           passnew=`echo -n $userpass|openssl md5|cut -d ' ' -f2`
           $MYsql -u$dbuser -p$dbpass $dbname -e "update $Pre set password='$passnew' where username='$userset';"           $MYsql -u$dbuser -p$dbpass $dbname -e "flush privileges;"     else           echo "$userset is not right user!"           exit 1     fielse     exit 2fi +wx:machinegunjoe666 领取资料
复制代码


7、slave_status.sh(检查 mysql 主从从结构中从数据库服务器的状态)

1)本机的数据库服务是否正在运行 2)能否与主数据库服务器正常通信 3)能否使用授权用户连接数据库服务器 4)本机的 slave_IO 进程是否处于 YES 状态本机的 slave_SQL 进程是否处于 YES 状态

[root@test1 scripts]# vim test.sh
#!/bin/bashnetstat -tulnp | grep :3306 > /dev/nullif [ $? -eq 0 ];thenecho "服务正在运行" elseservice mysqld startfiping -c 3 192.168.1.100 &> /dev/nullif [ $? -eq 0 ];thenecho "网络连接正常" elseecho "网络连接失败"fimysql -h192.168.1.100 -uroot -p123456 &> /dev/nullif [ $? -eq 0 ];thenecho "数据库连接成功" elseecho "数据库连接失败"fiIO= mysql -uroot -p123 -e "show slave status\G" | grep Slave_IO_Running | awk '{print $2}' > /dev/nullSQL= mysql -uroot -p123 -e "show slave status\G" | grep Slave_SQL_Running | awk '{print $2}' /dev/nullif [ IO==Yes ] && [ SQL==Yes ];thenecho “IO and SQL 连接成功”elseecho "IO线程和SQL线程连接失败"fi
复制代码


8、拒绝超过 n 次登陆的 ip 进行 ssh 连接

结合/var/log/secure文件,将ssh登陆失败次数大于N的IP封顶
N=3SEC_FILE=/var/log/securefor ip in `grep "Failed password" $SEC_FILE|grep -Eo "([0-9]{1,3}\.){3}[0-9]{1,3}"|sort -n|uniq -c|awk '{if($1>$N) print $2}'`doiptables -A INPUT -s $ip -p tcp --dport 22 -j DROPdone
复制代码


9、CentOS7 防止恶意破解 root 账户的脚本

#!/bin/bash#Denyhosts SHELL SCRIPT#2017-01-24##When a IP is accessed 50 times through sshd, it is written to the hosts.deny file, #which prohibits the IP from connecting to the host via sshd##Add to timing task
cat /var/log/secure | awk '/Failed/{print $(NF-3)}' | sort | uniq -c | awk '{print $2"="$1;}' > /root/black.txt
DEFINE=50for i in $(cat /root/black.txt)do    IP=$( $i | awk -F'=' '{print $1}')    NUM=$( $i | awk -F'=' '{print $2}')    if [$NUM -gt $DEFINE]; then        grep $IP /etc/hosts.deny > /dev/null        if [$? -gt 0];then            echo "sshd:$IP" >> /etc/hosts.deny        fi    fidone
复制代码


10、查看网卡实时流量

# vi check_network.sh
"#!/bin/bash
NIC=$1
echo -e "" In ------ Out""
while true; do
OLD_IN=$(awk '$0~""'$NIC'""{print $2}' /proc/net/dev)
OLD_OUT=$(awk '$0~""'$NIC'""{print $10}' /proc/net/dev)
sleep 1
NEW_IN=$(awk '$0~""'$NIC'""{print $2}' /proc/net/dev)
NEW_OUT=$(awk '$0~""'$NIC'""{print $10}' /proc/net/dev)
IN=$(printf ""%.1f%s"" ""$((($NEW_IN-$OLD_IN)/1024))"" ""KB/s"")
OUT=$(printf ""%.1f%s"" ""$((($NEW_OUT-$OLD_OUT)/1024))"" ""KB/s"")
echo ""$IN $OUT""
sleep 1
done"
执行:sh check.sh ens33
复制代码


11、批量查询网站是否可以访问

# vi check_web.sh
"#!/bin/bash
URL_LIST=""www.baidu.com www.sina.cn""
for URL in $URL_LIST; do
FAIL_COUNT=0
for ((i=1;i<=3;i++)); do
HTTP_CODE=$(curl -I -m 10 -o /dev/null -s -w %{http_code} $URL)
if [ $HTTP_CODE -eq 200 ]; then
echo ""$URL OK""
break
else
echo ""$URL retry $FAIL_COUNT""
let FAIL_COUNT++
fi
done
if [ $FAIL_COUNT -eq 3 ]; then
echo ""Warning: $URL Access failure!""
fi
done"
复制代码


12、检查 MySQL 主从同步状态

# vi check_mysql.sh
"#!/bin/bash
USER=bak
PASSWD=123456
IO_SQL_STATUS=$(mysql -u$USER -p$PASSWD -e 'show slave statusG' |awk -F:
'/Slave_.*_Running/{gsub("": "","":"");print $0}') #gsub 去除冒号后面的空格
for i in $IO_SQL_STATUS; do
THREAD_STATUS_NAME=${i%:*}
THREAD_STATUS=${i#*:}
if [ ""$THREAD_STATUS"" != ""Yes"" ]; then
echo ""Error: MySQL Master-Slave $THREAD_STATUS_NAME status is
$THREAD_STATUS!""
fi
done"
复制代码


13、DDOS 攻击 nginx 防范


"#!/bin/bash
DATE=$(date +%d/%b/%Y:%H:%M)
LOG_FILE=/etc/nginx/logs/access.log
ABNORMAL_IP=$(tail -n5000 $LOG_FILE |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>10)print i}')
for IP in $ABNORMALIP; do
if [ $(iptables -vnL |grep -c ""$IP"") -eq 0 ]; then
iptables -I INPUT -s $IP -j DROP
echo ""$(date +'%F%T') $IP"" >> /tmp/drop_ip.log
fi
done"
复制代码


本人还编写很多日常实用脚本 由于篇幅太大 就不一一写出来了 需要的朋友可以友情三连后扫描下方二维码 暗号:infoq 即可领取!



用户头像

Machine Gun

关注

还未添加个人签名 2021.03.28 加入

需要获取网络安全/渗透测试学习资料工具的朋友可联系V:machinegunjoe666 免费索取

评论

发布
暂无评论
【脚本小子狂喜】日常实用脚本推荐