博客
关于我
18 个一线工作中常用 Shell 脚本【实用版】
阅读量:790 次
发布时间:2023-01-24

本文共 4547 字,大约阅读时间需要 15 分钟。

Linux 系统管理 脚本指南

1. 服务器文件一致性检测

检测两台服务器指定目录下的文件一致性,通过对比双方的文件 MD5 值。

#!/bin/bash
dir=/data/web
b_ip=192.168.88.10
# 生成两台服务器的 MD5 文件
find $dir -type f | xargs md5sum > /tmp/md5_a.txt
ssh $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."
fi
done

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

每小时执行一次,规定时间清空目录下的文件或统计文件大小。

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
}

3. 网卡流量检测

检测网卡流量并记录日志,格式如:

2019-08-12 20:40 ens33 input: 1234bps output: 1235bps
#!/bin/bash
LANG=en
log=/tmp/`date +%d`.log
while:
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

4. 文档数字统计

统计文档中每行数字个数及总数。

n=$(wc -l a.txt | awk '{print $1}')
sum=0
for 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]
done
echo "sum: $sum"

5. 批量杀死进程

杀死所有已加载至 cron 的脚本进程。

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

6. 从 FTP 服务器下载文件

脚本用于从 FTP 服务器下载文件。

if [[ $1 -ne 1 ]]; then
echo "Usage: $0 filename"
fi
dir=$(dirname $1)
file=$(basename $1)
ftp -n -v < « *((继续) open 192.168.1.10 user admin password binary cd $dir get "$file")"

7. 用户猜数字游戏

生成随机数,提示用户猜测。

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

8. 监控 Nginx 502 错误

监测 Nginx 访问日志中的 502 错误比例,超过阈值则重启 PHP-FPM。

log=/data/log/access.log
N=30
while:
err=$(tail -n 300 $log | grep -c '502')
if [ $err -ge $N ]; then
restart php-fpm
sleep 60
else:
sleep 10
fi

9. 批量修改文件名

批量修改文件名中的某些字符(如从“article”改为“bbs”)。

for file in $(ls *html):
mv $file bbs_${file#*_}

10. 清理文档中不必要的字母行

删除包含字母的特定行,同时删除包含字母的文件内容。

sed -n '1,5p' 2.txt | sed '/[a-zA-Z]/'d
sed -n '6,10p' 2.txt | sed 's/[a-zA-Z]//g'
sed -n '11,$p' 2.txt

11. 扫描端口状态

检测指定主机字面上的特定端口状态。

host=$1
port="22 25 80 8080"
for port in $port:
if echo > /dev/null > /dev/tcp/$host/$port:
echo "$port open"
else:
echo "$port closed"
fi
done

12. 输入数字执行命令

根据用户输入选择不同的系统命令执行。

echo "*cmd menu* 1-date 2-ls 3-who 4-pwd 0-exit"
while:
read -p "请输入数字:"
n=$?.
# validate input
...
case $n in:
...
done

13. Expect 实现 SSH 免交互登录

通过 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 1
end
spawn ssh $user@$ip
expect {
("(yes/no)") continuu
"password:" send $passwd\r"
}
expect "$USER@*" send $cmd\r"
expect "$USER@*" send exit\r"
expect end

14. 监控 httpd 进程数

监控 httpd 进程数,若超限制则重启 Apache tentsrv。

#!/bin/bash
service_name="httpd"
threshold=500
while:
count=$(pgrep -l httpd | wc -l)
if [ $count -gt $threshold ]; then
if restart Apache failed:
exit
else:
sleep 60
else:
sleep 10
fi

15. 批量修改用户密码

从文件中读取 IP、用户密码,批量通过 SSH 修改密码。

old_info=old_pass.txt
new_info=new_pass.txt
for 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

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

根据日志检测异常访问 IP,超出 Threshold 的 withhold IP。

(具体实现需结合 Nginx 访问日志)

log=/data/log/access.log
ips=/tmp/ips.txt
block_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_ips
fi

17. 判断 IP 是否有效

通过正则表达式和范围检查确认 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/

你可能感兴趣的文章
ecplise中创建jsp页面时默认的编码格式为ISO-8859-1,这里我们将其编码格式设置为utf-8...
查看>>
ECSHOP实现收货国家省市由选择下拉菜单改为手动
查看>>
ECShop模板原理
查看>>
edgeboxes proposal 和dpm 连接
查看>>
EdgeX Foundry:开启边缘计算新时代
查看>>
EdgeX Foundry:边缘计算的创新平台
查看>>
EdgeX Foundry:边缘计算的未来趋势与应用
查看>>
Edge浏览器打开控制台后程序总是停止进入debug模式关闭教程【八仙过海之又一过海方案】
查看>>
Educational Codeforces Round 28
查看>>
Educational Codeforces Round 47 (Rated for Div. 2)F. Dominant Indices 线段树合并
查看>>
ed编辑器--适用于shell脚本内编辑文件的最最简单编辑器
查看>>
"SQLServer复制需要有实际的服务器名称才能连接到服务器,请指定实际的服务器名"转...
查看>>
EF 资料
查看>>
EF6.0中出现未找到具有固定名称“System.Data.SqlClient”的 ADO.NET提供程序的实体框架提供程序解决办法...
查看>>
EF6与MVC5系列(4):在MVC应用程序中使用弹性连接和命令拦截
查看>>
Effective C# 学习笔记(四十五)减少装箱拆箱行为
查看>>
Effective Modern C++:02auto
查看>>
efficientnet最合适的尺寸和最后一层的层数
查看>>
EF三种编程方式详细图文教程(C#+EF)之Database First
查看>>
Ehcache Java开源缓存框架
查看>>