本文共 4547 字,大约阅读时间需要 15 分钟。
检测两台服务器指定目录下的文件一致性,通过对比双方的文件 MD5 值。
#!/bin/bashdir=/data/webb_ip=192.168.88.10# 生成两台服务器的 MD5 文件find $dir -type f | xargs md5sum > /tmp/md5_a.txtssh $b_ip "find $dir -type f | xargs md5sum > /tmp/md5_b.txt"# 比较配置文件for f in $(awk '{print 2}' /tmp/md5_a.txt): if grep -qw "$f" /tmp/md5_b.txt: 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." else: echo "$f deleted." fidone
每小时执行一次,规定时间清空目录下的文件或统计文件大小。
define LogFile() { log=/tmp/`date +%H-%F`.log}n=$(date +H)if [[ $n -eq 00 || $n -eq 12 ]]; then for i in $(find /data/log/ -type f): true > $i else: for i in $(find /data/log/ -type f): du -sh $i >> $log fi}
检测网卡流量并记录日志,格式如:
2019-08-12 20:40 ens33 input: 1234bps output: 1235bps
#!/bin/bashLANG=enlog=/tmp/`date +%d`.logwhile: exec >$log date +"%F %H:%M" sar -n DEV 1 59 | grep Average | grep ens33 | awk '{print $2, "input:", $5*1000*8bps, "output:", $6*1000*8bps}' echo "####################"done
统计文档中每行数字个数及总数。
n=$(wc -l a.txt | awk '{print $1}')sum=0for i in `seq 1 $n`: line=$(sed -n $i p a.txt) n_n=$(echo $line | sed 's/[^0-9]//'g | wc -L) sum[$sum += $n_n]doneecho "sum: $sum"
杀死所有已加载至 cron 的脚本进程。
ps aux | grep 指定进程名 | grep -v grep | awk '{print $2}' | xargs kill -9
脚本用于从 FTP 服务器下载文件。
if [[ $1 -ne 1 ]]; then echo "Usage: $0 filename"fidir=$(dirname $1)file=$(basename $1)ftp -n -v < « *((继续) open 192.168.1.10 user admin password binary cd $dir get "$file")"
生成随机数,提示用户猜测。
num=$[RANDOM%100+1]echo "$num"while: read -p "请输入1-10个整数:" INT=$?). if [[ ! $INT =~ ^[0-9]+$ ]]; then echo "请输入整数!" 且退出 elif [[ $INT > 100 ]]; then echo "输入必须是100以内!" 且退出 fi ... ...done
监测 Nginx 访问日志中的 502 错误比例,超过阈值则重启 PHP-FPM。
log=/data/log/access.logN=30while: err=$(tail -n 300 $log | grep -c '502') if [ $err -ge $N ]; then restart php-fpm sleep 60 else: sleep 10fi
批量修改文件名中的某些字符(如从“article”改为“bbs”)。
for file in $(ls *html): mv $file bbs_${file#*_}
删除包含字母的特定行,同时删除包含字母的文件内容。
sed -n '1,5p' 2.txt | sed '/[a-zA-Z]/'dsed -n '6,10p' 2.txt | sed 's/[a-zA-Z]//g'sed -n '11,$p' 2.txt
检测指定主机字面上的特定端口状态。
host=$1port="22 25 80 8080"for port in $port: if echo > /dev/null > /dev/tcp/$host/$port: echo "$port open" else: echo "$port closed" fidone
根据用户输入选择不同的系统命令执行。
echo "*cmd menu* 1-date 2-ls 3-who 4-pwd 0-exit"while: read -p "请输入数字:" n=$?. # validate input ...case $n in: ...done
通过 Expect 脚本实现 SSH 免交互登录。
set ip [lindex $argv 0]set user [lindex $argv 1]set passwd [lindex $argv 2]set cmd [lindex $argv 3]if [ $argc != 4 ]; then puts "Usage: expect login.exp ip user passwd" exit 1endspawn ssh $user@$ipexpect { ("(yes/no)") continuu "password:" send $passwd\r" }expect "$USER@*" send $cmd\r"expect "$USER@*" send exit\r"expect end
监控 httpd 进程数,若超限制则重启 Apache tentsrv。
#!/bin/bashservice_name="httpd"threshold=500while: count=$(pgrep -l httpd | wc -l) if [ $count -gt $threshold ]; then if restart Apache failed: exit else: sleep 60 else: sleep 10fi
从文件中读取 IP、用户密码,批量通过 SSH 修改密码。
old_info=old_pass.txtnew_info=new_pass.txtfor ip in $(awk '/[^#]/ {print $1}' old_info): user=$(awk -v I=$ip '{print $2}' old_info) pass=$(awk -v I=$ip '{print $3}' old_info) new_pass=$(mkpasswd -l 8) echo "$ip $user $new_pass $port" > new_info expect -c "..."done
根据日志检测异常访问 IP,超出 Threshold 的 withhold IP。
(具体实现需结合 Nginx 访问日志)
log=/data/log/access.logips=/tmp/ips.txtblock_ips() { grep "$DATE:" $log | awk '{print $1}' | sort -u | uniq -c | sort -nr for ip in $iplist: if iptables -vnL | grep -c "$ip" == 0: iptables -I INPUT -s $ip -j DROP echo "2023-XX-XX 00:00:00 - - - $ip 屏蔽"}unblock_ips() { iptables -D INPUT -s $ip -j DROP}DATE=$(date +d '-1 minute')if [[ $d -eq 0 || $d -eq 30 ]]; then unblock_ips block_ipsfi
通过正则表达式和范围检查确认 IP 是否有效。
function check_ip { IP=$1 validate=$(echo $IP | awk -F . '{print $1, $2, $3, $4}') if [[ $validate <= 255 && $validate2 <= 255 && ... ]]; then echo "$IP available." else: echo "$IP not available!" fi}检查 IP 是否为有效 IP
以上为若干实用的 Linux 系统管理脚本,适用于日常运维和自动化任务处理,帮助管理员简化操作流程和提高工作效率。
转载地址:http://geeyk.baihongyu.com/