Shell脚本是采集系统信息的强大工具,可以快速获取服务器的各种运行状态和配置信息。本文将详细介绍如何使用Shell脚本采集各类系统信息。
#!/bin/bash
# 获取系统信息
echo "========== 系统基本信息 =========="
echo "主机名: $(hostname)"
echo "操作系统: $(cat /etc/os-release | grep "PRETTY_NAME" | cut -d'"' -f2)"
echo "内核版本: $(uname -r)"
echo "系统架构: $(uname -m)"
echo "当前时间: $(date)"
echo "系统运行时间: $(uptime)"
echo "========== CPU信息 =========="
echo "CPU型号: $(cat /proc/cpuinfo | grep 'model name' | head -1 | cut -d':' -f2 | sed 's/^[ \t]*//')"
echo "CPU核心数: $(grep -c 'processor' /proc/cpuinfo)"
echo "CPU使用率: $(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1"%"}')"
echo "========== 内存信息 =========="
free -h | grep -v "Swap" | awk '{print "总内存: "$2, "已用: "$3, "剩余: "$4}'
echo "内存使用率: $(free | grep Mem | awk '{printf "%.2f%", $3/$2*100}')"
echo "========== 磁盘信息 =========="
df -h | grep -v "tmpfs" | grep -v "udev"
echo "========== 磁盘IO信息 =========="
iostat -dx 1 2 | tail -n +7
echo "========== 大文件查找 =========="
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{print $5, $9}'
echo "========== 网络接口信息 =========="
ip addr show | grep -w "inet" | grep -v "127.0.0.1"
echo "========== 网络连接状态 =========="
ss -tulnp
echo "========== 带宽使用情况 =========="
sar -n DEV 1 2 | grep -v "Average"
echo "========== 进程信息 =========="
ps aux --sort=-%cpu | head -10
echo "========== 服务状态 =========="
systemctl list-units --type=service --state=running
echo "========== 高资源占用进程 =========="
top -b -n 1 | head -12
echo "========== 登录用户信息 =========="
who
echo "最近登录用户:"
last | head -10
echo "========== 特权用户检查 =========="
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 {print $1}'
echo "========== 开放的SUID程序 =========="
find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;
echo "========== 定时任务 =========="
echo "用户定时任务:"
crontab -l
echo "系统定时任务:"
ls /etc/cron.*
cat /etc/crontab
将以上各部分整合成一个完整的系统信息采集脚本:
#!/bin/bash
# 定义输出文件
REPORT_FILE="system_report_$(date +%Y%m%d_%H%M%S).txt"
# 函数:打印分隔线
print_separator() {
echo "==========================================" >> $REPORT_FILE
}
# 函数:打印标题
print_title() {
echo "" >> $REPORT_FILE
echo "========== $1 ==========" >> $REPORT_FILE
}
# 清空或创建报告文件
echo "系统信息采集报告 - 生成时间: $(date)" > $REPORT_FILE
print_separator
# 1. 系统基本信息
print_title "系统基本信息"
{
echo "主机名: $(hostname)"
echo "操作系统: $(cat /etc/os-release | grep "PRETTY_NAME" | cut -d'"' -f2)"
echo "内核版本: $(uname -r)"
echo "系统架构: $(uname -m)"
echo "当前时间: $(date)"
echo "系统运行时间: $(uptime)"
} >> $REPORT_FILE
# 2. CPU信息
print_title "CPU信息"
{
echo "CPU型号: $(cat /proc/cpuinfo | grep 'model name' | head -1 | cut -d':' -f2 | sed 's/^[ \t]*//')"
echo "CPU核心数: $(grep -c 'processor' /proc/cpuinfo)"
echo "CPU使用率: $(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1"%"}')"
} >> $REPORT_FILE
# 3. 内存信息
print_title "内存信息"
{
free -h | grep -v "Swap" | awk '{print "总内存: "$2, "已用: "$3, "剩余: "$4}'
echo "内存使用率: $(free | grep Mem | awk '{printf "%.2f%", $3/$2*100}')"
} >> $REPORT_FILE
# 4. 磁盘信息
print_title "磁盘信息"
{
df -h | grep -v "tmpfs" | grep -v "udev"
echo ""
echo "磁盘IO信息:"
iostat -dx 1 2 | tail -n +7
} >> $REPORT_FILE
# 5. 网络信息
print_title "网络信息"
{
echo "网络接口信息:"
ip addr show | grep -w "inet" | grep -v "127.0.0.1"
echo ""
echo "网络连接状态:"
ss -tulnp
echo ""
echo "带宽使用情况:"
sar -n DEV 1 2 | grep -v "Average"
} >> $REPORT_FILE
# 6. 进程与服务
print_title "进程与服务"
{
echo "CPU占用前10进程:"
ps aux --sort=-%cpu | head -10
echo ""
echo "内存占用前10进程:"
ps aux --sort=-%mem | head -10
echo ""
echo "运行中的服务:"
systemctl list-units --type=service --state=running
} >> $REPORT_FILE
# 7. 安全信息
print_title "安全信息"
{
echo "登录用户:"
who
echo ""
echo "最近登录记录:"
last | head -10
echo ""
echo "特权用户:"
grep -v -E "^#" /etc/passwd | awk -F: '$3 == 0 {print $1}'
echo ""
echo "SUID程序:"
find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;
} >> $REPORT_FILE
# 8. 定时任务
print_title "定时任务"
{
echo "用户定时任务:"
crontab -l
echo ""
echo "系统定时任务:"
ls /etc/cron.*
cat /etc/crontab
} >> $REPORT_FILE
print_separator
echo "系统信息采集完成,报告已保存到: $REPORT_FILE"
system_info_collector.sh
chmod +x system_info_collector.sh
./system_info_collector.sh
定时采集:使用crontab设置定时任务定期执行采集脚本
# 每天凌晨1点执行
0 1 * * * /path/to/system_info_collector.sh
远程采集:结合SSH实现远程服务器信息采集
ssh user@remote_host "/path/to/system_info_collector.sh"
scp user@remote_host:/path/to/system_report_*.txt .
邮件通知:使用mail命令发送报告
mail -s "系统信息报告" admin@example.com < $REPORT_FILE
日志分析:添加日志分析功能,如检查错误日志
echo "========== 错误日志检查 =========="
grep -i "error" /var/log/syslog | tail -20
通过以上Shell脚本,您可以全面了解系统的运行状态,及时发现潜在问题,为系统维护和优化提供数据支持。