在一线工作中,Shell脚本是提高效率的得力助手。无论是文件管理、系统监控,还是定时任务自动化,掌握这些常用脚本能够帮助我们轻松应对日常工作中的各种挑战,节省时间和精力。在本教程中,我们将探索一些常用的Shell脚本实例,助你在实际工作中得心应手。
监控目录文件一致性
检测两台服务器指定目录下的文件一致性
#!/bin/bash
######################################
# 检测两台服务器指定目录下的文件一致性
######################################
# 通过对比两台服务器上文件的md5值,达到检测一致性的目的
dir="/data/web"
b_ip="192.168.88.10"
temp_dir="/tmp"
# 获取本地文件的md5值
find "$dir" -type f -exec md5sum {} + > "$temp_dir/md5_a.txt"
# 获取远程服务器的md5值
ssh "$b_ip" "find $dir -type f -exec md5sum {} +" > "$temp_dir/md5_b.txt"
# 逐行比较md5值
while read -r line; do
f=$(echo "$line" | awk '{print $2}')
md5_a=$(echo "$line" | awk '{print $1}')
if grep -qw "$f" "$temp_dir/md5_b.txt"; then
md5_b=$(grep -w "$f" "$temp_dir/md5_b.txt" | awk '{print $1}')
if [[ "$md5_a" != "$md5_b" ]]; then
echo "$f changed."
fi
else
echo "$f deleted."
fi
done < "$temp_dir/md5_a.txt"
监控网卡流量情况
检测网卡流量,并按规定格式记录在日志中
#!/bin/bash
#######################################################
# 检测网卡流量,并按规定格式记录在日志中
# 规定一分钟记录一次
# 日志格式如下所示:
# 2024-10-08 10:40
# ens33 input: 1234bps
# ens33 output: 1235bps
#######################################################
# 设置语言为英文,保障输出结果是英文,否则会出现bug
LANG=en
iface="eth0" # 替换为你的网卡名称
logfile="/tmp/$(date +%d).log"
while true; do
# 将日期输出重定向到logfile日志中
{
date +"%F %H:%M"
# 获取网卡流量数据
sar -n DEV 1 59 | awk -v iface="$iface" '
/Average/ && $2 == iface {
input = $5 * 1000 * 8
output = $6 * 1000 * 8
printf "%s input: %d bps\n", iface, input
printf "%s output: %d bps\n", iface, output
}
'
echo "####################"
} >> "$logfile"
# 因为执行sar命令需要59秒,因此不需要sleep
done
执行上述脚本后会在tmp目录以日期生成一个日志文件,内容如下所示:
root@didiplus:/tmp# tail 08.log
####################
2024-10-08 10:24
eth0 input: 2640 bps
eth0 output: 12800 bps
####################
2024-10-08 10:25
eth0 input: 1440 bps
eth0 output: 14240 bps
####################
从 FTP 服务器下载文件:
#!/bin/bash
#######################################################
# 从FTP服务器下载文件的Shell脚本
#######################################################
# 用户输入FTP用户名和密码
read -p "请输入FTP地址: " ftp_server
read -p "请输入FTP用户名: " ftp_user
read -sp "请输入FTP密码: " ftp_pass
read -p "请输入远程文件路径: " remote_file_path
read -p "请输入本地保存路径: " local_file_path
echo # 输出换行
# 使用ftp命令下载文件
{
echo "open $ftp_server"
echo "user $ftp_user $ftp_pass"
echo "binary" # 以二进制模式传输文件
echo "get $remote_file_path $local_file_path"
echo "bye"
} | ftp -n
# 检查下载是否成功
if [[ $? -eq 0 ]]; then
echo "文件下载成功: $local_file_path"
else
echo "文件下载失败"
fi
扫描主机端口状态
通过指定端口范围进行端口扫描:
#!/bin/bash
#######################################################
# 扫描主机端口状态,并记录开放的端口
#######################################################
# 用户输入要扫描的主机和端口范围
read -p "请输入要扫描的主机IP: " host
read -p "请输入起始端口: " start_port
read -p "请输入结束端口: " end_port
logfile="/tmp/open_ports.log"
# 清空日志文件
> "$logfile"
echo "正在扫描主机 $host 的端口..."
# 扫描端口
for ((port=start_port; port<=end_port; port++)); do
# 尝试连接到端口
{ echo > /dev/tcp/$host/$port; } &>/dev/null
if [[ $? -eq 0 ]]; then
echo "端口 $port 开放" | tee -a "$logfile"
fi
done
echo "扫描完成,开放的端口记录在 $logfile"
执行上述脚本,输出如下结果:
root@didiplus:~/script# ./port_scanner.sh
请输入要扫描的主机IP: 127.0.0.1
请输入起始端口: 1024
请输入结束端口: 64454
正在扫描主机 127.0.0.1 的端口...
端口 3306 开放
端口 5320 开放
端口 6010 开放
端口 6011 开放
端口 6012 开放
端口 7000 开放
端口 7500 开放
端口 8080 开放
端口 8090 开放
端口 43982 开放
端口 54114 开放
扫描完成,开放的端口记录在 /tmp/open_ports.log
计算文档出现数字的总数
计算文档每行出现的数字个数,并计算整个文档的数字总数
#!/bin/bash
#######################################################
# 计算文档每行出现的数字个数,并计算整个文档的数字总数
#######################################################
# 检查输入参数
if [ "$#" -ne 1 ]; then
echo "用法: $0 <文档路径>"
exit 1
fi
file="$1"
total_count=0
# 检查文件是否存在
if [ ! -f "$file" ]; then
echo "文件不存在: $file"
exit 1
fi
# 读取文件并计算每行数字个数和总数
echo "每行数字个数:"
while IFS= read -r line; do
# 计算当前行数字个数
line_count=$(echo "$line" | grep -o '[0-9]' | wc -l)
echo "$line_count"
# 累加到总数
total_count=$((total_count + line_count))
done < "$file"
# 输出总数字个数
echo "文档总数字个数: $total_count"
总结
Shell脚本在工作中的应用主要体现在自动化任务、系统管理和数据处理等方面。通过编写Shell脚本,用户可以高效地执行重复性操作,如文件管理、系统监控和网络管理,从而提高工作效率,减少人为错误,简化复杂任务的执行过程。