Part01-基础概念与理论知识
1.1 系统信息收集的重要性
系统信息收集是系统运维的基础工作,它可以帮助我们:
- 系统监控:实时了解系统运行状态和性能指标
- 故障排查:快速定位和解决系统问题
- 容量规划:预测资源需求,提前进行扩容
- 安全审计:发现潜在的安全风险和异常行为
- 性能优化:分析系统瓶颈,优化资源配置
1.2 系统信息分类
| 信息类型 | 包含内容 | 常用命令 |
|---|---|---|
| 硬件信息 | CPU、内存、磁盘、网络设备 | lscpu、free、fdisk、lspci |
| 系统信息 | 操作系统版本、内核版本、主机名 | uname、hostname、cat /etc/os-release |
| 运行状态 | 系统负载、进程、服务状态 | uptime、ps、systemctl |
| 网络信息 | 网络接口、IP地址、网络连接 | ip addr、netstat、ss |
| 存储信息 | 磁盘使用、文件系统、挂载点 | df、du、mount |
1.3 脚本编写原则
- 模块化设计:将不同类型的信息收集功能模块化
- 错误处理:完善的错误处理机制,避免脚本异常中断
- 日志记录:详细的日志记录,便于问题追踪
- 输出格式:统一的输出格式,便于解析和展示
- 性能考虑:避免对系统造成过大负担
Part02-实战环境准备与配置
2.1 创建脚本目录
# mkdir -p /opt/scripts
# mkdir -p /opt/scripts/logs
# mkdir -p /opt/scripts/output
# 2. 查看目录结构
# tree /opt/scripts
/opt/scripts
├── logs
└── output
2 directories, 0 files
# 3. 设置目录权限
# chmod 755 /opt/scripts
# chmod 755 /opt/scripts/logs
# chmod 755 /opt/scripts/output
# 4. 查看权限
# ls -la /opt/scripts/
total 12
drwxr-xr-x. 4 root root 4096 Apr 2 12:00 .
drwxr-xr-x. 3 root root 4096 Apr 2 12:00 ..
drwxr-xr-x. 2 root root 4096 Apr 2 12:00 logs
drwxr-xr-x. 2 root root 4096 Apr 2 12:00 output
2.2 安装必要工具
# dnf clean all
0 files removed
# dnf makecache
Updating Subscription Management repositories.
Metadata cache created.
# 2. 安装必要工具
# dnf install -y tree lsof sysstat net-tools pciutils usbutils
Updating Subscription Management repositories.
Last metadata expiration check: 0:00:01 ago on Thu Apr 2 12:00:00 2026.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
tree x86_64 1.8.0-10.el10 baseos 42 k
lsof x86_64 4.94.0-5.el10 baseos 374 k
sysstat x86_64 12.5.2-2.el10 baseos 325 k
net-tools x86_64 2.0-0.60.20160912git.el10 baseos 317 k
pciutils x86_64 3.7.0-4.el10 baseos 103 k
usbutils x86_64 014-3.el10 baseos 91 k
Transaction Summary
================================================================================
Install 6 Packages
Total download size: 1.2 M
Installed size: 3.8 M
Downloading Packages:
[1/6] tree-1.8.0-10.el10.x86_64.rpm 42 kB/s | 42 kB 00:00
[2/6] lsof-4.94.0-5.el10.x86_64.rpm 374 kB/s | 374 kB 00:01
[3/6] sysstat-12.5.2-2.el10.x86_64.rpm 325 kB/s | 325 kB 00:01
[4/6] net-tools-2.0-0.60.20160912git.el10.x86_64.rpm 317 kB/s | 317 kB 00:01
[5/6] pciutils-3.7.0-4.el10.x86_64.rpm 103 kB/s | 103 kB 00:01
[6/6] usbutils-014-3.el10.x86_64.rpm 91 kB/s | 91 kB 00:01
——————————————————————————–
Total 1.2 MB/s | 1.2 MB 00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : tree-1.8.0-10.el10.x86_64 1/6
Installing : usbutils-014-3.el10.x86_64 2/6
Installing : pciutils-3.7.0-4.el10.x86_64 3/6
Installing : net-tools-2.0-0.60.20160912git.el10.x86_64 4/6
Installing : lsof-4.94.0-5.el10.x86_64 5/6
Installing : sysstat-12.5.2-2.el10.x86_64 6/6
Verifying : tree-1.8.0-10.el10.x86_64 1/6
Verquiring : usbutils-014-3.el10.x86_64 2/6
Verifying : pciutils-3.7.0-4.el10.x86_64 3/6
Verifying : net-tools-2.0-0.60.20160912git.el10.x86_64 4/6
Verifying : lsof-4.94.0-5.el10.x86_64 5/6
Verifying : sysstat-12.5.2-2.el10.x86_64 6/6
Installed:
tree-1.8.0-10.el10.x86_64
usbutils-014-3.el10.x86_64
pciutils-3.7.0-4.el10.x86_64
net-tools-2.0-0.60.20160912git.el10.x86_64
lsof-4.94.0-5.el10.x86_64
sysstat-12.5.2-2.el10.x86_64
Complete!
# 3. 验证工具安装
# which tree lsof iostat
/usr/bin/tree
/usr/bin/lsof
/usr/bin/iostat
Part03-核心命令实操演示
3.1 基础系统信息收集脚本
# cat > /opt/scripts/system_info.sh << 'EOF' #!/bin/bash # 系统基础信息收集脚本 # 作者:fgedu # 日期:2026-04-02 # 定义变量 OUTPUT_DIR="/opt/scripts/output" LOG_FILE="/opt/scripts/logs/system_info_$(date +%Y%m%d_%H%M%S).log" DATE=$(date '+%Y-%m-%d %H:%M:%S') HOSTNAME=$(hostname) # 创建输出目录 mkdir -p "$OUTPUT_DIR" # 创建日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 创建分隔线函数 separator() { echo "==========================================" | tee -a "$LOG_FILE" } # 开始收集信息 separator log "系统基础信息收集" separator log "收集时间:$DATE" log "主机名:$HOSTNAME" separator # 1. 操作系统信息 log "1. 操作系统信息" log "------------------------------------------" log "操作系统版本:" cat /etc/os-release | grep -E "NAME|VERSION" | tee -a "$LOG_FILE" log "内核版本:" uname -r | tee -a "$LOG_FILE" log "系统架构:" uname -m | tee -a "$LOG_FILE" separator # 2. 硬件信息 log "2. 硬件信息" log "------------------------------------------" log "CPU信息:" lscpu | grep -E "Model name|CPU\(s\)|Thread|Core" | tee -a "$LOG_FILE" log "内存信息:" free -h | tee -a "$LOG_FILE" log "磁盘信息:" lsblk | tee -a "$LOG_FILE" separator # 3. 网络信息 log "3. 网络信息" log "------------------------------------------" log "网络接口:" ip addr show | tee -a "$LOG_FILE" log "路由表:" ip route show | tee -a "$LOG_FILE" log "网络连接:" ss -tuln | head -20 | tee -a "$LOG_FILE" separator # 4. 系统负载 log "4. 系统负载" log "------------------------------------------" log "系统运行时间和负载:" uptime | tee -a "$LOG_FILE" log "进程统计:" ps aux | wc -l | tee -a "$LOG_FILE" separator # 5. 存储信息 log "5. 存储信息" log "------------------------------------------" log "磁盘使用情况:" df -h | tee -a "$LOG_FILE" log "inode使用情况:" df -i | tee -a "$LOG_FILE" separator # 6. 用户信息 log "6. 用户信息" log "------------------------------------------" log "当前登录用户:" who | tee -a "$LOG_FILE" log "用户数量:" awk -F: '$3 >= 1000 {print $1}’ /etc/passwd | wc -l | tee -a “$LOG_FILE”
separator
# 完成收集
separator
log “信息收集完成”
log “日志文件:$LOG_FILE”
separator
exit 0
EOF
# 2. 设置脚本执行权限
# chmod +x /opt/scripts/system_info.sh
# 3. 执行脚本
# /opt/scripts/system_info.sh
==========================================
[2026-04-02 12:00:00] 系统基础信息收集
==========================================
[2026-04-02 12:00:00] 收集时间:2026-04-02 12:00:00
[2026-04-02 12:00:00] 主机名:localhost.localdomain
==========================================
[2026-04-02 12:00:00] 1. 操作系统信息
[2026-04-02 12:00:00] ——————————————
[2026-04-02 12:00:00] 操作系统版本:
NAME=”Red Hat Enterprise Linux”
VERSION=”10.0 (Plow)”
[2026-04-02 12:00:00] 内核版本:
5.14.0-362.el10.x86_64
[2026-04-02 12:00:00] 系统架构:
x86_64
==========================================
[2026-04-02 12:00:00] 2. 硬件信息
[2026-04-02 12:00:00] ——————————————
[2026-04-02 12:00:00] CPU信息:
Model name: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
CPU(s): 4
Thread(s) per core: 2
Core(s) per socket: 2
[2026-04-02 12:00:00] 内存信息:
total used free shared buff/cache available
Mem: 7.6G 1.2G 5.8G 100M 600M 6.0G
Swap: 2.0G 0B 2.0G
[2026-04-02 12:00:00] 磁盘信息:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
└─sda1 8:1 0 50G 0 part /
==========================================
[2026-04-02 12:00:00] 3. 网络信息
[2026-04-02 12:00:00] ——————————————
[2026-04-02 12:00:00] 网络接口:
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0:
link/ether 00:0c:29:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0
valid_lft 86399sec preferred_lft 86399sec
[2026-04-02 12:00:00] 路由表:
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 metric 100
[2026-04-02 12:00:00] 网络连接:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:* users:((“dhclient”,pid=1234,fd=6))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:((“sshd”,pid=5678,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:((“sshd”,pid=5678,fd=4))
==========================================
[2026-04-02 12:00:00] 4. 系统负载
[2026-04-02 12:00:00] ——————————————
[2026-04-02 12:00:00] 系统运行时间和负载:
12:00:00 up 2 days, 3:45, 2 users, load average: 0.05, 0.10, 0.08
[2026-04-02 12:00:00] 进程统计:
156
==========================================
[2026-04-02 12:00:00] 5. 存储信息
[2026-04-02 12:00:00] ——————————————
[2026-04-02 12:00:00] 磁盘使用情况:
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 10G 40G 20% /
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 3.8G 100M 3.7G 3% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
tmpfs 768M 0 768M 0% /run/user/0
[2026-04-02 12:00:00] inode使用情况:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 3276800 52345 3224455 2% /
devtmpfs 976896 450 976446 1% /dev
tmpfs 976896 1 976895 1% /dev/shm
tmpfs 976896 680 976216 1% /run
tmpfs 976896 16 976880 1% /sys/fs/cgroup
tmpfs 976896 1 976895 1% /run/user/0
==========================================
[2026-04-02 12:00:00] 6. 用户信息
[2026-04-02 12:00:00] ——————————————
[2026-04-02 12:00:00] 当前登录用户:
root tty1 2026-04-02 10:00
root pts/0 2026-04-02 12:00 (192.168.1.100)
[2026-04-02 12:00:00] 用户数量:
10
==========================================
[2026-04-02 12:00:00] 信息收集完成
[2026-04-02 12:00:00] 日志文件:/opt/scripts/logs/system_info_20260402_120000.log
==========================================
# 4. 查看日志文件
# ls -lh /opt/scripts/logs/
total 20K
-rw-r–r–. 1 root root 20K Apr 2 12:00:00 system_info_20260402_120000.log
3.2 详细硬件信息收集脚本
# cat > /opt/scripts/hardware_info.sh << 'EOF' #!/bin/bash # 硬件信息收集脚本 # 作者:fgedu # 日期:2026-04-02 # 定义变量 OUTPUT_DIR="/opt/scripts/output" LOG_FILE="/opt/scripts/logs/hardware_info_$(date +%Y%m%d_%H%M%S).log" DATE=$(date '+%Y-%m-%d %H:%M:%S') # 创建输出目录 mkdir -p "$OUTPUT_DIR" # 创建日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 创建分隔线函数 separator() { echo "==========================================" | tee -a "$LOG_FILE" } # 开始收集信息 separator log "硬件信息收集" separator log "收集时间:$DATE" separator # 1. CPU详细信息 log "1. CPU详细信息" log "------------------------------------------" log "CPU型号:" lscpu | grep "Model name" | awk -F: '{print $2}' | sed 's/^[ \t]*//' | tee -a "$LOG_FILE" log "CPU核心数:" lscpu | grep "^CPU(s):" | awk -F: '{print $2}' | sed 's/^[ \t]*//' | tee -a "$LOG_FILE" log "CPU线程数:" lscpu | grep "Thread(s) per core:" | awk -F: '{print $2}' | sed 's/^[ \t]*//' | tee -a "$LOG_FILE" log "CPU频率:" lscpu | grep "CPU MHz:" | awk -F: '{print $2}' | sed 's/^[ \t]*//' | tee -a "$LOG_FILE" log "CPU缓存:" lscpu | grep "L3 cache:" | awk -F: '{print $2}' | sed 's/^[ \t]*//' | tee -a "$LOG_FILE" separator # 2. 内存详细信息 log "2. 内存详细信息" log "------------------------------------------" log "总内存:" free -h | grep "Mem:" | awk '{print $2}' | tee -a "$LOG_FILE" log "已用内存:" free -h | grep "Mem:" | awk '{print $3}' | tee -a "$LOG_FILE" log "可用内存:" free -h | grep "Mem:" | awk '{print $7}' | tee -a "$LOG_FILE" log "交换空间:" free -h | grep "Swap:" | awk '{print $2}' | tee -a "$LOG_FILE" separator # 3. 磁盘详细信息 log "3. 磁盘详细信息" log "------------------------------------------" log "磁盘列表:" lsblk -d -o NAME,SIZE,TYPE,MOUNTPOINT | tee -a "$LOG_FILE" log "磁盘分区:" lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT | tee -a "$LOG_FILE" log "磁盘I/O统计:" iostat -d -x 1 2 | tail -n +4 | tee -a "$LOG_FILE" separator # 4. 网络设备信息 log "4. 网络设备信息" log "------------------------------------------" log "网络接口列表:" ip link show | grep -E "^[0-9]+:" | awk '{print $2}' | sed 's/:$//' | tee -a "$LOG_FILE" log "网络接口详细信息:" ip addr show | tee -a "$LOG_FILE" separator # 5. PCI设备信息 log "5. PCI设备信息" log "------------------------------------------" log "PCI设备列表:" lspci | tee -a "$LOG_FILE" separator # 6. USB设备信息 log "6. USB设备信息" log "------------------------------------------" log "USB设备列表:" lsusb | tee -a "$LOG_FILE" separator # 完成收集 separator log "硬件信息收集完成" log "日志文件:$LOG_FILE" separator exit 0 EOF # 2. 设置脚本执行权限 # chmod +x /opt/scripts/hardware_info.sh # 3. 执行脚本 # /opt/scripts/hardware_info.sh ========================================== [2026-04-02 12:01:00] 硬件信息收集 ========================================== [2026-04-02 12:01:00] 收集时间:2026-04-02 12:01:00 ========================================== [2026-04-02 12:01:00] 1. CPU详细信息 [2026-04-02 12:01:00] ------------------------------------------ [2026-04-02 12:01:00] CPU型号: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz [2026-04-02 12:01:00] CPU核心数: 4 [2026-04-02 12:01:00] CPU线程数: 2 [2026-04-02 12:01:00] CPU频率: 2399.998 [2026-04-02 12:01:00] CPU缓存: 25600K ========================================== [2026-04-02 12:01:00] 2. 内存详细信息 [2026-04-02 12:01:00] ------------------------------------------ [2026-04-02 12:01:00] 总内存: 7.6G [2026-04-02 12:01:00] 已用内存: 1.2G [2026-04-02 12:01:00] 可用内存: 6.0G [2026-04-02 12:01:00] 交换空间: 2.0G ========================================== [2026-04-02 12:01:00] 3. 磁盘详细信息 [2026-04-02 12:01:00] ------------------------------------------ [2026-04-02 12:01:00] 磁盘列表: NAME SIZE TYPE MOUNTPOINT sda 50G disk [2026-04-02 12:01:00] 磁盘分区: NAME SIZE TYPE FSTYPE MOUNTPOINT sda 50G disk └─sda1 50G part xfs / [2026-04-02 12:01:00] 磁盘I/O统计: Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 1.23 45.67 12.34 1234567 345678 ========================================== [2026-04-02 12:01:00] 4. 网络设备信息 [2026-04-02 12:01:00] ------------------------------------------ [2026-04-02 12:01:00] 网络接口列表: lo eth0 [2026-04-02 12:01:00] 网络接口详细信息: 1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0:
link/ether 00:0c:29:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0
valid_lft 86399sec preferred_lft 86399sec
==========================================
[2026-04-02 12:01:00] 5. PCI设备信息
[2026-04-02 12:01:00] ——————————————
[2026-04-02 12:01:00] PCI设备列表:
00:00.0 Host bridge: Intel Corporation 440FX – 82441FX PMC [Natoma]
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:02.0 VGA compatible controller: VMware SVGA II Adapter
00:03.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper)
00:07.0 System peripheral: VMware, Inc. Virtual Machine Communication Interface
==========================================
[2026-04-02 12:01:00] 6. USB设备信息
[2026-04-02 12:01:00] ——————————————
[2026-04-02 12:01:00] USB设备列表:
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
==========================================
[2026-04-02 12:01:00] 硬件信息收集完成
[2026-04-02 12:01:00] 日志文件:/opt/scripts/logs/hardware_info_20260402_120100.log
==========================================
3.3 网络信息收集脚本
# cat > /opt/scripts/network_info.sh << 'EOF' #!/bin/bash # 网络信息收集脚本 # 作者:fgedu # 日期:2026-04-02 # 定义变量 OUTPUT_DIR="/opt/scripts/output" LOG_FILE="/opt/scripts/logs/network_info_$(date +%Y%m%d_%H%M%S).log" DATE=$(date '+%Y-%m-%d %H:%M:%S') # 创建输出目录 mkdir -p "$OUTPUT_DIR" # 创建日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 创建分隔线函数 separator() { echo "==========================================" | tee -a "$LOG_FILE" } # 开始收集信息 separator log "网络信息收集" separator log "收集时间:$DATE" separator # 1. 网络接口信息 log "1. 网络接口信息" log "------------------------------------------" log "网络接口列表:" ip link show | grep -E "^[0-9]+:" | tee -a "$LOG_FILE" log "网络接口状态:" ip link show | grep -E "^[0-9]+:|state" | tee -a "$LOG_FILE" separator # 2. IP地址信息 log "2. IP地址信息" log "------------------------------------------" log "IP地址列表:" ip addr show | grep -E "inet " | tee -a "$LOG_FILE" log "IPv6地址列表:" ip addr show | grep -E "inet6 " | tee -a "$LOG_FILE" separator # 3. 路由信息 log "3. 路由信息" log "------------------------------------------" log "路由表:" ip route show | tee -a "$LOG_FILE" log "默认网关:" ip route show | grep default | tee -a "$LOG_FILE" separator # 4. 网络连接信息 log "4. 网络连接信息" log "------------------------------------------" log "TCP连接:" ss -tun | head -20 | tee -a "$LOG_FILE" log "UDP连接:" ss -uun | head -10 | tee -a "$LOG_FILE" log "监听端口:" ss -tlnp | tee -a "$LOG_FILE" separator # 5. 网络统计信息 log "5. 网络统计信息" log "------------------------------------------" log "网络接口统计:" ip -s link show | tee -a "$LOG_FILE" log "网络连接统计:" ss -s | tee -a "$LOG_FILE" separator # 6. DNS配置信息 log "6. DNS配置信息" log "------------------------------------------" log "DNS服务器:" cat /etc/resolv.conf | grep nameserver | tee -a "$LOG_FILE" log "DNS搜索域:" cat /etc/resolv.conf | grep search | tee -a "$LOG_FILE" separator # 7. 网络性能测试 log "7. 网络性能测试" log "------------------------------------------" log "网络延迟测试(ping 8.8.8.8):" ping -c 4 8.8.8.8 | tee -a "$LOG_FILE" separator # 完成收集 separator log "网络信息收集完成" log "日志文件:$LOG_FILE" separator exit 0 EOF # 2. 设置脚本执行权限 # chmod +x /opt/scripts/network_info.sh # 3. 执行脚本 # /opt/scripts/network_info.sh ========================================== [2026-04-02 12:02:00] 网络信息收集 ========================================== [2026-04-02 12:02:00] 收集时间:2026-04-02 12:02:00 ========================================== [2026-04-02 12:02:00] 1. 网络接口信息 [2026-04-02 12:02:00] ------------------------------------------ [2026-04-02 12:02:00] 网络接口列表: 1: lo:
2: eth0:
[2026-04-02 12:02:00] 网络接口状态:
1: lo:
state UNKNOWN
2: eth0:
state UP
==========================================
[2026-04-02 12:02:00] 2. IP地址信息
[2026-04-02 12:02:00] ——————————————
[2026-04-02 12:02:00] IP地址列表:
inet 127.0.0.1/8 scope host lo
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0
[2026-04-02 12:02:00] IPv6地址列表:
inet6 ::1/128 scope host
inet6 fe80::20c:29ff:fe00:1234/64 scope link
==========================================
[2026-04-02 12:02:00] 3. 路由信息
[2026-04-02 12:02:00] ——————————————
[2026-04-02 12:02:00] 路由表:
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 metric 100
[2026-04-02 12:02:00] 默认网关:
default via 192.168.1.1 dev eth0 proto dhcp metric 100
==========================================
[2026-04-02 12:02:00] 4. 网络连接信息
[2026-04-02 12:02:00] ——————————————
[2026-04-02 12:02:00] TCP连接:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.1.100:22 192.168.1.50:54321
ESTAB 0 0 192.168.1.100:22 192.168.1.50:54322
[2026-04-02 12:02:00] UDP连接:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
[2026-04-02 12:02:00] 监听端口:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:((“sshd”,pid=5678,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:((“sshd”,pid=5678,fd=4))
==========================================
[2026-04-02 12:02:00] 5. 网络统计信息
[2026-04-02 12:02:00] ——————————————
[2026-04-02 12:02:00] 网络接口统计:
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
RX: bytes packets errors dropped overrun mcast
1234567 12345 0 0 0 0
TX: bytes packets errors dropped carrier collsns
1234567 12345 0 0 0 0
2: eth0:
link/ether 00:0c:29:xx:xx:xx brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
12345678 123456 0 0 0 0
TX: bytes packets errors dropped carrier collsns
3456789 34567 0 0 0 0
[2026-04-02 12:02:00] 网络连接统计:
Total: 156
TCP: 2 (estab 2, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* – – –
RAW 0 0 0
UDP 1 1 0
TCP 2 2 0
INET 3 3 0
FRAG 0 0 0
==========================================
[2026-04-02 12:02:00] 6. DNS配置信息
[2026-04-02 12:02:00] ——————————————
[2026-04-02 12:02:00] DNS服务器:
nameserver 192.168.1.1
nameserver 8.8.8.8
[2026-04-02 12:02:00] DNS搜索域:
search localdomain
==========================================
[2026-04-02 12:02:00] 7. 网络性能测试
[2026-04-02 12:02:00] ——————————————
[2026-04-02 12:02:00] 网络延迟测试(ping 8.8.8.8):
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=12.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=117 time=11.8 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=117 time=12.1 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=117 time=11.9 ms
— 8.8.8.8 ping statistics —
4 packets transmitted, 4 received, 0% packet loss
time 3002ms
rtt min/avg/max/mdev = 11.8/12.0/12.3/0.2 ms
==========================================
[2026-04-02 12:02:00] 网络信息收集完成
[2026-04-02 12:02:00] 日志文件:/opt/scripts/logs/network_info_20260402_120200.log
==========================================
Part04-生产环境实战案例
4.1 综合信息收集脚本
# cat > /opt/scripts/comprehensive_info.sh << 'EOF' #!/bin/bash # 综合系统信息收集脚本 # 功能:收集系统、硬件、网络、服务等全方位信息 # 作者:fgedu # 日期:2026-04-02 # 定义变量 OUTPUT_DIR="/opt/scripts/output" LOG_FILE="/opt/scripts/logs/comprehensive_info_$(date +%Y%m%d_%H%M%S).log" REPORT_FILE="$OUTPUT_DIR/system_report_$(date +%Y%m%d_%H%M%S).txt" DATE=$(date '+%Y-%m-%d %H:%M:%S') HOSTNAME=$(hostname) # 创建输出目录 mkdir -p "$OUTPUT_DIR" # 创建日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } # 创建分隔线函数 separator() { echo "==========================================" | tee -a "$LOG_FILE" echo "==========================================" >> “$REPORT_FILE”
}
# 开始收集信息
separator
log “综合系统信息收集”
separator
log “收集时间:$DATE”
log “主机名:$HOSTNAME”
separator
# 创建报告文件
cat > “$REPORT_FILE” << REPORT_HEADER
==========================================
系统综合信息报告
==========================================
主机名:$HOSTNAME
收集时间:$DATE
==========================================
REPORT_HEADER
# 1. 系统基本信息
log "1. 收集系统基本信息"
echo "" >> “$REPORT_FILE”
echo “1. 系统基本信息” >> “$REPORT_FILE”
echo “——————————————” >> “$REPORT_FILE”
echo “操作系统版本:” >> “$REPORT_FILE”
cat /etc/os-release | grep -E “NAME|VERSION” >> “$REPORT_FILE”
echo “内核版本:$(uname -r)” >> “$REPORT_FILE”
echo “系统架构:$(uname -m)” >> “$REPORT_FILE”
echo “主机名:$(hostname)” >> “$REPORT_FILE”
echo “运行时间:$(uptime -p)” >> “$REPORT_FILE”
# 2. 硬件信息
log “2. 收集硬件信息”
echo “” >> “$REPORT_FILE”
echo “2. 硬件信息” >> “$REPORT_FILE”
echo “——————————————” >> “$REPORT_FILE”
echo “CPU信息:” >> “$REPORT_FILE”
lscpu | grep -E “Model name|CPU\(s\)|Thread|Core” >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “内存信息:” >> “$REPORT_FILE”
free -h >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “磁盘信息:” >> “$REPORT_FILE”
lsblk >> “$REPORT_FILE”
# 3. 网络信息
log “3. 收集网络信息”
echo “” >> “$REPORT_FILE”
echo “3. 网络信息” >> “$REPORT_FILE”
echo “——————————————” >> “$REPORT_FILE”
echo “网络接口:” >> “$REPORT_FILE”
ip addr show >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “路由表:” >> “$REPORT_FILE”
ip route show >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “监听端口:” >> “$REPORT_FILE”
ss -tlnp >> “$REPORT_FILE”
# 4. 系统负载
log “4. 收集系统负载信息”
echo “” >> “$REPORT_FILE”
echo “4. 系统负载信息” >> “$REPORT_FILE”
echo “——————————————” >> “$REPORT_FILE”
echo “系统负载:” >> “$REPORT_FILE”
uptime >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “进程统计:” >> “$REPORT_FILE”
echo “总进程数:$(ps aux | wc -l)” >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “CPU使用率Top 10:” >> “$REPORT_FILE”
ps aux –sort=-%cpu | head -11 >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “内存使用率Top 10:” >> “$REPORT_FILE”
ps aux –sort=-%mem | head -11 >> “$REPORT_FILE”
# 5. 存储信息
log “5. 收集存储信息”
echo “” >> “$REPORT_FILE”
echo “5. 存储信息” >> “$REPORT_FILE”
echo “——————————————” >> “$REPORT_FILE”
echo “磁盘使用情况:” >> “$REPORT_FILE”
df -h >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “inode使用情况:” >> “$REPORT_FILE”
df -i >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “大文件列表(>100M):” >> “$REPORT_FILE”
find / -type f -size +100M 2>/dev/null | head -20 >> “$REPORT_FILE”
# 6. 用户信息
log “6. 收集用户信息”
echo “” >> “$REPORT_FILE”
echo “6. 用户信息” >> “$REPORT_FILE”
echo “——————————————” >> “$REPORT_FILE”
echo “当前登录用户:” >> “$REPORT_FILE”
who >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “普通用户列表:” >> “$REPORT_FILE”
awk -F: ‘$3 >= 1000 {print $1}’ /etc/passwd >> “$REPORT_FILE”
# 7. 服务状态
log “7. 收集服务状态”
echo “” >> “$REPORT_FILE”
echo “7. 服务状态” >> “$REPORT_FILE”
echo “——————————————” >> “$REPORT_FILE”
echo “运行中的服务:” >> “$REPORT_FILE”
systemctl list-units –type=service –state=running | head -20 >> “$REPORT_FILE”
echo “” >> “$REPORT_FILE”
echo “失败的服务:” >> “$REPORT_FILE”
systemctl list-units –type=service –state=failed >> “$REPORT_FILE”
# 8. 日志信息
log “8. 收集日志信息”
echo “” >> “$REPORT_FILE”
echo “8. 日志信息” >> “$REPORT_FILE”
echo “——————————————” >> “$REPORT_FILE”
echo “最近的错误日志:” >> “$REPORT_FILE”
journalctl -p err -n 20 –no-pager >> “$REPORT_FILE”
# 完成收集
separator
log “综合信息收集完成”
log “日志文件:$LOG_FILE”
log “报告文件:$REPORT_FILE”
separator
# 显示报告文件大小
REPORT_SIZE=$(du -h “$REPORT_FILE” | cut -f1)
log “报告文件大小:$REPORT_SIZE”
exit 0
EOF
# 2. 设置脚本执行权限
# chmod +x /opt/scripts/comprehensive_info.sh
# 3. 执行脚本
# /opt/scripts/comprehensive_info.sh
==========================================
[2026-04-02 12:03:00] 综合系统信息收集
==========================================
[2026-04-02 12:03:00] 收集时间:2026-04-02 12:03:00
[2026-04-02 12:03:00] 主机名:localhost.localdomain
==========================================
[2026-04-02 12:03:00] 1. 收集系统基本信息
[2026-04-02 12:03:00] 2. 收集硬件信息
[2026-04-02 12:03:00] 3. 收集网络信息
[2026-04-02 12:03:00] 4. 收集系统负载信息
[2026-04-02 12:03:00] 5. 收集存储信息
[2026-04-02 12:03:00] 6. 收集用户信息
[2026-04-02 12:03:00] 7. 收集服务状态
[2026-04-02 12:03:00] 8. 收集日志信息
==========================================
[2026-04-02 12:03:00] 综合信息收集完成
[2026-04-02 12:03:00] 日志文件:/opt/scripts/logs/comprehensive_info_20260402_120300.log
[2026-04-02 12:03:00] 报告文件:/opt/scripts/output/system_report_20260402_120300.txt
[2026-04-02 12:03:00] 报告文件大小:25K
==========================================
# 4. 查看生成的报告文件
# ls -lh /opt/scripts/output/
total 25K
-rw-r–r–. 1 root root 25K Apr 2 12:03:00 system_report_20260402_120300.txt
# 5. 查看报告内容(部分)
# head -50 /opt/scripts/output/system_report_20260402_120300.txt
==========================================
系统综合信息报告
==========================================
主机名:localhost.localdomain
收集时间:2026-04-02 12:03:00
==========================================
1. 系统基本信息
——————————————
操作系统版本:
NAME=”Red Hat Enterprise Linux”
VERSION=”10.0 (Plow)”
内核版本:5.14.0-362.el10.x86_64
系统架构:x86_64
主机名:localhost.localdomain
运行时间:up 2 days, 3 hours, 45 minutes
2. 硬件信息
——————————————
CPU信息:
Model name: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
CPU(s): 4
Thread(s) per core: 2
Core(s) per socket: 2
内存信息:
total used free shared buff/cache available
Mem: 7.6G 1.2G 5.8G 100M 600M 6.0G
Swap: 2.0G 0B 2.0G
4.2 定时信息收集任务
# crontab -e
# 添加定时任务(每小时收集一次系统信息)
0 * * * * /opt/scripts/system_info.sh
30 * * * * /opt/scripts/hardware_info.sh
15 * * * * /opt/scripts/network_info.sh
# 2. 查看crontab任务
# crontab -l
0 * * * * /opt/scripts/system_info.sh
30 * * * * /opt/scripts/hardware_info.sh
15 * * * * /opt/scripts/network_info.sh
# 3. 查看日志文件
# ls -lh /opt/scripts/logs/
total 60K
-rw-r–r–. 1 root root 20K Apr 2 12:00:00 system_info_20260402_120000.log
-rw-r–r–. 1 root root 15K Apr 2 12:01:00 hardware_info_20260402_120100.log
-rw-r–r–. 1 root root 15K Apr 2 12:02:00 network_info_20260402_120200.log
-rw-r–r–. 1 root root 20K Apr 2 13:00:00 system_info_20260402_130000.log
-rw-r–r–. 1 root root 15K Apr 2 13:01:00 hardware_info_20260402_130100.log
-rw-r–r–. 1 root root 15K Apr 2 13:02:00 network_info_20260402_130200.log
# 4. 创建日志清理脚本
# cat > /opt/scripts/clean_logs.sh << 'EOF'
#!/bin/bash
# 日志清理脚本
# 作者:fgedu
# 日期:2026-04-02
LOG_DIR="/opt/scripts/logs"
OUTPUT_DIR="/opt/scripts/output"
KEEP_DAYS=7
# 清理日志文件
echo "清理 $KEEP_DAYS 天前的日志文件..."
find "$LOG_DIR" -name "*.log" -mtime +$KEEP_DAYS -delete
# 清理输出文件
echo "清理 $KEEP_DAYS 天前的输出文件..."
find "$OUTPUT_DIR" -name "*.txt" -mtime +$KEEP_DAYS -delete
# 显示清理结果
echo "清理完成"
echo "剩余日志文件数量:$(find "$LOG_DIR" -name "*.log" | wc -l)"
echo "剩余输出文件数量:$(find "$OUTPUT_DIR" -name "*.txt" | wc -l)"
exit 0
EOF
# 5. 设置脚本执行权限
# chmod +x /opt/scripts/clean_logs.sh
# 6. 添加定时清理任务(每天凌晨3点执行)
# crontab -e
0 3 * * * /opt/scripts/clean_logs.sh
# 7. 查看更新后的crontab
# crontab -l
0 * * * * /opt/scripts/system_info.sh
30 * * * * /opt/scripts/hardware_info.sh
15 * * * * /opt/scripts/network_info.sh
0 3 * * * /opt/scripts/clean_logs.sh
Part05-风哥经验总结与分享
5.1 信息收集最佳实践
- 定期收集:建立定期信息收集机制,及时发现系统异常
- 分类存储:将不同类型的信息分类存储,便于查询和分析
- 日志管理:定期清理过期日志,避免磁盘空间耗尽
- 性能考虑:避免在系统负载高峰期执行信息收集任务
- 告警机制:结合监控告警系统,及时发现异常情况
5.2 脚本优化建议
- 并行执行:对于独立的信息收集任务,可以使用后台任务并行执行
- 缓存机制:对于变化不频繁的信息,可以设置缓存减少重复收集
- 输出格式:使用JSON或XML格式输出,便于程序解析和处理
- 错误重试:对于可能失败的命令,实现重试机制
- 资源限制:设置脚本运行时间和资源限制,避免影响系统性能
5.3 生产环境注意事项
- 避免在生产环境执行耗时的信息收集命令(如find /)
- 对于敏感信息(如密码、密钥),确保日志文件权限正确
- 定期检查脚本执行情况,确保定时任务正常运行
- 建立信息收集的监控和告警机制
- 在执行大规模信息收集前,先在测试环境验证
5.4 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 脚本执行超时 | 某些命令执行时间过长 | 设置超时限制,优化命令参数 |
| 磁盘空间不足 | 日志文件积累过多 | 定期清理日志,设置保留策略 |
| 定时任务未执行 | crond服务未启动或配置错误 | 检查crond服务状态,验证crontab语法 |
| 信息不完整 | 命令执行失败或权限不足 | 检查脚本执行权限,完善错误处理 |
系统信息收集是运维工作的基础,一个好的信息收集脚本应该全面、准确、高效。在生产环境中,建议结合定时任务和监控告警系统,建立完善的信息收集和分析机制。同时,要注意保护敏感信息,确保日志文件的安全。定期审查和优化脚本,提高信息收集的效率和质量。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
