Shell脚本实战分享:让你的工作效率翻倍

在工作中,我们经常需要使用一些自动化工具来提高工作效率。其中,Shell脚本是一种非常实用的工具,可以帮助我们快速完成各种任务。今天,我来分享一些常用的Shell脚本,希望对大家有所帮助。

创新互联公司技术团队十多年来致力于为客户提供成都网站制作、成都网站建设、高端网站设计全网营销推广、搜索引擎SEO优化等服务。经过多年发展,公司拥有经验丰富的技术团队,先后服务、推广了成百上千家网站,包括各类中小企业、企事单位、高校等机构单位。

1.检测两台服务器指定目录下的文件一致性

这个脚本可以用于比较两个服务器上的指定目录是否一致。通过比较文件的文件的MD5值,可以快速发现两个服务器之间的差异。

#!/bin/bash  
######################################  
检测两台服务器指定目录下的文件一致性  
#####################################  
#通过对比两台服务器上文件的md5值,达到检测一致性的目的  
dir=/data/web  
b_ip=192.168.88.10  
#将指定目录下的文件全部遍历出来并作为md5sum命令的参数,进而得到所有文件的md5值,并写入到指定文件中  
find $dir -type f|xargs md5sum > /tmp/md5_a.txt  
ssh $b_ip"find $dir -type f|xargs md5sum > /tmp/md5_b.txt"
scp $b_ip:/tmp/md5_b.txt /tmp  
#将文件名作为遍历对象进行一一比对  
for f in `awk '{print 2} /tmp/md5_a.txt'`do
#以a机器为标准,当b机器不存在遍历对象中的文件时直接输出不存在的结果  
if grep -qw "$f" /tmp/md5_b.txt  
then
md5_a=`grep -w "$f" /tmp/md5_a.txt|awk '{print 1}'`  
md5_b=`grep -w "$f" /tmp/md5_b.txt|awk '{print 1}'`  
#当文件存在时,如果md5值不一致则输出文件改变的结果  
if [ $md5_a != $md5_b ]then
echo"$f changed."
fi
else
echo"$f deleted."
fi
done

2.检测网卡流量,并按规定格式记录在日志中

该脚本是通过执行sar命令,把服务器的网卡信息收集起来,可以通过该脚本把网卡的流量做成图表可视化的界面:

#!/bin/bash  
#######################################################  
#检测网卡流量,并按规定格式记录在日志中#规定一分钟记录一次  
#日志格式如下所示:  
#2019-08-12 20:40  
#ens33 input: 1234bps  
#ens33 output: 1235bps  
######################################################3  
while :  
do
#设置语言为英文,保障输出结果是英文,否则会出现bug  
LANG=en  
logfile=/tmp/`date +%d`.log
#将下面执行的命令结果输出重定向到logfile日志中  
exec >> $logfile
date +"%F %H:%M"
#sar命令统计的流量单位为kb/s,日志格式为bps,因此要*1000*8  
sar -n DEV 1 59|grep Average|grep ens33|awk '{print $2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}'
echo"####################"
#因为执行sar命令需要59秒,因此不需要sleep  
done

3.监测 Nginx 访问日志 502 情况,并做相应动作

假设服务器环境为 lnmp,近期访问经常出现 502 现象,且 502 错误在重启 php-fpm 服务后消失,因此需要编写监控脚本,一旦出现 502,则自动重启 php-fpm 服务。

#场景:
#1.访问日志文件的路径:/data/log/access.log  
#2.脚本死循环,每10秒检测一次,10秒的日志条数为300条,出现502的比例不低于10%(30条)则需要重启php-fpm服务  
#3.重启命令为:/etc/init.d/php-fpm restart  
#!/bin/bash  
###########################################################  
#监测Nginx访问日志502情况,并做相应动作  
###########################################################  
log=/data/log/access.log  
N=30 #设定阈值  
while :do
 #查看访问日志的最新300条,并统计502的次数  
    err=`tail -n 300 $log |grep -c '502" '`   
if [ $err -ge $N ]   
then
/etc/init.d/php-fpm restart 2> /dev/null   
#设定60s延迟防止脚本bug导致无限重启php-fpm服务  
     sleep 60  
 fi
 sleep 10  
 done

4.扫描主机端口状态

在日常的工作中,通常需要扫描主机开放了哪些端口,进而作出合理的安全规划,通过以下的脚本,可以大大提高效率

#!/bin/bash

# 检查参数数量
if [ "$#" -ne 2 ]; then
    echo"用法:$0  <端口号>"
    exit 1
fi

IP="$1"
PORT="$2"

# 使用nc (netcat) 命令扫描端口
nc -z -v -w5 "$IP""$PORT" > /dev/null 2>&1

# 根据nc命令的返回值判断端口状态
if [ $? -eq 0 ]; then
    echo"端口 $PORT 是开放的"
else
    echo"端口 $PORT 是关闭的"
fi

将此脚本保存为scan_port.sh,并确保它具有可执行权限(使用chmod +x scan_port.sh)。然后,您可以通过提供目标IP地址和端口号来运行此脚本,例如:

./scan_port.sh 192.168.1.1 80

5.Expect 实现 SSH 免交互执行命令

Expect是一个自动交互式应用程序的工具,如telnet,ftp,passwd等。

需先安装expect软件包

方法1:EOF标准输出作为expect标准输入

#!/bin/bash  
USER=root  
PASS=123.com  
IP=192.168.1.120  
expect << EOFset timeout 30spawn ssh $USER@$IP   expect {    "(yes/no)" {send "yes\r"; exp_continue}    "password:" {send "$PASS\r"}  
}  
expect "$USER@*"  {send "$1\r"}  
expect "$USER@*"  {send "exit\r"}  
expect eof  
EOF

方法2:

#!/bin/bash  
USER=root  
PASS=123.com  
IP=192.168.1.120  
expect -c "  
    spawn ssh $USER@$IP  
    expect {  
        \"(yes/no)\" {send \"yes\r\"; exp_continue}  
        \"password:\" {send \"$PASS\r\"; exp_continue}  
        \"$USER@*\" {send \"df -h\r exit\r\"; exp_continue}  
    }"

将expect脚本独立出来

登录脚本:
# cat login.exp  
#!/usr/bin/expect  
set ip [lindex $argv 0]  
set user [lindex $argv 1]  
set passwd [lindex $argv 2]  
set cmd [lindex $argv 3]  
if { $argc != 4 } {  
puts "Usage: expect login.exp ip user passwd"
exit 1  
}  
set timeout 30  
spawn ssh $user@$ip
expect {      
    "(yes/no)" {send "yes\r"; exp_continue}  
    "password:" {send "$passwd\r"}  
}  
expect "$user@*"  {send "$cmd\r"}  
expect "$user@*"  {send "exit\r"}  
expect eof

执行命令脚本:写个循环可以批量操作多台服务器:

#!/bin/bash  
HOST_INFO=user_info.txt  
for ip in $(awk '{print $1}'$HOST_INFO)  
do
    user=$(awk -v I="$ip"'I==$1{print $2}'$HOST_INFO)  
    pass=$(awk -v I="$ip"'I==$1{print $3}'$HOST_INFO)  
    expect login.exp $ip$user$pass$1
done

user_info.txt的内容格式如下:192.168.1.120 root 123456

6.iptables 自动屏蔽访问网站频繁的IP

场景:恶意访问,安全防范

(1) 屏蔽每分钟访问超过200的IP

方法1:根据访问日志(Nginx为例)

#!/bin/bash  
DATE=$(date +%d/%b/%Y:%H:%M)  
ABNORMAL_IP=$(tail -n5000 access.log |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>100)print i}')  
#先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量。awk不能直接过滤日志,因为包含特殊字符。
for IP in$ABNORMAL_IP; do
    if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then
        iptables -I INPUT -s $IP -j DROP   
    fi
done

方法2:通过TCP建立的连接

#!/bin/bash  
ABNORMAL_IP=$(netstat -an |awk '$4~/:80$/ && $6~/ESTABLISHED/{gsub(/:[0-9]+/,"",$5);{a[$5]++}}END{for(i in a)if(a[i]>100)print i}')  
#gsub是将第五列(客户端IP)的冒号和端口去掉  
for IP in$ABNORMAL_IP; do
    if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then
        iptables -I INPUT -s $IP -j DROP      
        fi
done

(2) 屏蔽每分钟SSH尝试登录超过10次的IP

方法1:通过lastb获取登录状态:

#!/bin/bash  
DATE=$(date +"%a %b %e %H:%M") #星期月天时分  %e单数字时显示7,而%d显示07  
ABNORMAL_IP=$(lastb |grep "$DATE" |awk '{a[$3]++}END{for(i in a)if(a[i]>10)print i}')for IP in$ABNORMAL_IP; do
    if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then
        iptables -I INPUT -s $IP -j DROP    
    fi
done

方法2:通过日志获取登录状态

#!/bin/bash  
DATE=$(date +"%b %d %H")  
ABNORMAL_IP="$(tail -n10000 /var/log/auth.log |grep "$DATE" |awk '/Failed/{a[$(NF-3)]++}END{for(i in a)if(a[i]>5)print i}')"
for IP in$ABNORMAL_IP; do
    if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then
        iptables -A INPUT -s $IP -j DROP          
        echo"$(date +"%F %T") - iptables -A INPUT -s $IP -j DROP" >>~/ssh-login-limit.log      
    fi
done

anyway,以上是关于日常工作中常用的脚本分享。

新闻标题:Shell脚本实战分享:让你的工作效率翻倍
标题来源:http://www.shufengxianlan.com/qtweb/news13/30563.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联