暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一线运维工程师必备的18个shell脚本

michaelliu 2025-02-18
215
1.检测两台服务器指定目录下的文件一致性

#!/bin/bash
dir=/data/web
b_ip=192.168.88.10
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
    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}')
        if [ "$md5_a" != "$md5_b" ]; then
            echo "$f changed."
        fi
    else
        echo "$f deleted."
    fi
done

2. 定时清空文件内容,定时记录文件大小

#!/bin/bash
logfile=/tmp/$(date +%H-%F).log
n=$(date +%H)
if["$n"-eq 00 ]||["$n"-eq12];then
    foriin$(find /data/log/ -type f);do
        true>"$i"
    done
else
    foriin$(find /data/log/ -type f);do
        du-sh"$i">>"$logfile"
    done
fi

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

#!/bin/bash
while:;do
    LANG=en
    logfile=/tmp/$(date +%d).log
    exec>>"$logfile"
    date +"%F %H:%M"
    sar -n DEV 159|grep Average |grep ens33 |awk'{print $2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}'
    echo"####################"
done

4. 杀死所有脚本

#!/bin/bash
ps aux | grep 指定进程名 | grep -v grep | awk '{print $2}' | xargs kill -9

5. 从 FTP 服务器下载文件

#!/bin/bash
if[$#-ne1];then
    echo"Usage: $0 filename"
fi
dir=$(dirname "$1")
file=$(basename "$1")
ftp-n-v<<EOF
open 192.168.1.10
user admin password
binary
cd "$dir"
get "$file"
EOF

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

#!/bin/bash
log=/data/log/access.log
N=30
while:;do
    err=$(tail -n 300 "$log" | grep -c '502" ')
    if["$err"-ge"$N"];then
        /etc/init.d/php-fpm restart 2> /dev/null
        sleep60
    fi
    sleep10
done

7. 扫描主机端口状态

#!/bin/bash
HOST=$1
PORT="22 25 80 8080"
forPORTin$PORT;do
    ifecho&>/dev/null > /dev/tcp/"$HOST"/"$PORT";then
        echo"$PORT open"
    else
        echo"$PORT close"
    fi
done

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

#!/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}
}"

9. 创建 10 个用户,并分别设置密码

#!/bin/bash
foruin$(seq -w 0 09);do
    useradd user_$u
    p=$(mkpasswd -s 0 -l 10)
    echo"$p"|passwd--stdin user_$u
    echo"user_$u $p">> /tmp/userpassword
done

10. 批量修改服务器用户密码

#!/bin/bash
OLD_INFO=old_pass.txt
NEW_INFO=new_pass.txt
forIPin$(awk '/^[^#]/{print $1}' $OLD_INFO);do
    USER=$(awk -v I=$IP 'I==$1{print $2}' $OLD_INFO)
    PASS=$(awk -v I=$IP 'I==$1{print $3}' $OLD_INFO)
    PORT=$(awk -v I=$IP 'I==$1{print $4}' $OLD_INFO)
    NEW_PASS=$(mkpasswd -l 8)
    echo"$IP $USER $NEW_PASS $PORT">>$NEW_INFO
    expect-c"
    spawn ssh -p$PORT $USER@$IP
    set timeout 2
    expect {
        \"(yes/no)\" {send \"yes\r\";exp_continue}
        \"password:\" {send \"$PASS\r\";exp_continue}
        \"$USER@*\" {send \"echo '$NEW_PASS' |passwd --stdin $USER\r exit\r\";exp_continue}
    }"
done

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

#!/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}')
forIPin$ABNORMAL_IP;do
    if[$(iptables -vnL | grep -c "$IP")-eq0];then
        iptables -I INPUT -s"$IP"-j DROP
    fi
done

12. 根据 web 访问日志,封禁请求量异常的 IP

#!/bin/bash
logfile=/data/log/access.log
d1=$(date -d "-1 minute" +%H%M)
d2=$(date +%M)
ipt=/sbin/iptables
ips=/tmp/ips.txt
block(){
    grep"$d1:""$logfile"|awk'{print $1}'|sort-n|uniq-c|sort-n>"$ips"
    foriin$(awk '$1>100 {print $2}' "$ips");do
        $ipt-I INPUT -p tcp --dport80-s"$i"-j REJECT
        echo"$(date +%F-%T) $i">> /tmp/badip.log
    done
}
unblock(){
    forain$($ipt -nvL INPUT --line-numbers | grep '0.0.0.0/0' | awk '$2<10 {print $1}' | sort -nr);do
        $ipt-D INPUT "$a"
    done
    $ipt-Z
}
if["$d2"-eq"00"]||["$d2"-eq"30"];then
    unblock
    block
else
    block
fi

13. 自动优化 Linux 内核参数

#!/bin/bash
cat >> /usr/lib/sysctl.d/00-system.conf << EOF
fs.file-max=65535
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 5
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65535
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmin = 4096
kernel.sem = 5010 641280 5010 128
net.core.wmem_default=262144
net.core.wmem_max=262144
net.core.rmem_default=4194304
net.core.rmem_max=4194304
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
EOF

14. 切割 Nginx 日志文件

#!/bin/bash
logs_path="/usr/local/nginx/logs/"
mv"${logs_path}access.log""${logs_path}access_$(date +"%Y%m%d" -d yesterday).log"
kill-USR1$(cat /usr/local/nginx/logs/nginx.pid)
once=0
if["$once"-eq0];then
    echo"0 1 * * * $(readlink -f "$0")">> /var/spool/cron/$USER
    sed-i"/^once=/s/0/1/""$0"
fi

15. 检测 MySQL 服务是否存活

#!/bin/bash
host=检测的 MySQL 主机 ip
user=MySQL 用户名
passwd=密码
mysqladmin -h"$host" -u"$user" -p"$passwd"ping&> /dev/null
if[$?-eq0];then
    echo"MySQL is UP"
else
    echo"MySQL is down"
fi

16. 检测 MySQL 数据库连接数量

#!/bin/bash
log_file=/var/log/mysql_count.log
user=用户名
passwd=密码
while :; do
    sleep 2
    count=$(mysqladmin -u"$user" -p"$passwd" status | awk '{print $4}')
    echo "$(date +%Y-%m-%d) 并发连接数为:$count" >> "$log_file"
done

17. 查看所有虚拟机磁盘使用量及 CPU 使用量信息

#!/bin/bash
rpm--quiet-q libguestfs-tools-c
[$?-ne0]&& yum -yinstall libguestfs-tools-c --nogpgcheck
virt-df |column-t
read-n1"按任意键继续 " key
rpm--quiet-q virt-top
[$?-ne0]&& yum -yinstall virt-top
virt-top

18. 破解虚拟机密码,无密码登录虚拟机系统

#!/bin/bash
read-p"请输入虚拟机名称: " name
ifvirsh domstate "$name"|grep-q running;then
    echo"破解,需先关闭虚拟机"
    virshshutdown"$name"
fi
mountpoint="/media/virtimage"
[!-d"$mountpoint"]&&mkdir"$mountpoint"
echo"请稍后。。。"
ifmount|grep-q"$mountpoint";then
    umount"$mountpoint"
fi
guestmount -d"$name"-i"$mountpoint"
sed-i"/^root/s/x//""$mountpoint/etc/passwd"
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论