如何编写系统信息收集脚本

wen 实用脚本 2

系统信息收集脚本编写终极指南:从零到自动化审计


目录导读

  1. 为什么需要系统信息收集脚本?(安全审计与运维的刚需)
  2. 脚本的设计原则:模块化与可移植性
  3. 核心采集项:CPU、内存、磁盘、网络与进程
  4. 高级技巧:跨平台兼容(Linux/Windows)与权限处理
  5. 自动化与报告生成:定时任务+结构化输出
  6. 实战问答:解决编写过程中的五大常见坑

在IT运维与安全攻防中,系统信息收集脚本是高效排查故障追踪入侵痕迹实现合规审计的基石,一个优秀的脚本不仅能瞬间抓取数百项指标,还能在数百台服务器上并行执行,许多开发者在编写时常常陷入“只会用ifconfig”或“输出杂乱无章”的困境,本文将结合搜索引擎中的最佳实践(如Stack Overflow高赞回答、Red Hat官方文档),深度拆解编写精髓,助你打造企业级采集工具。

如何编写系统信息收集脚本

为什么需要系统信息收集脚本?

手动执行topdf -h固然简单,但面对集群环境时,人工操作效率低下且易遗漏,脚本的价值在于标准化采集流程(例如统一时间戳)和快速生成对比基线,尤其在等保2.0合规检测中,自动化收集/var/log/secure中的登录记录、/etc/passwd的权限变更,是审计的基础,在应急响应中,脚本需在黄金10分钟内完成内存快照与网络连接转储,为后续取证提供原始数据。

脚本的设计原则:模块化与可移植性

核心原则:一个功能一个函数,避免“意大利面条式”代码。

  • 模块化:将采集逻辑拆分为get_cpu_info()get_memory_info()等独立函数,这样便于单测与后续维护。
  • 可移植性:使用环境变量或参数判断操作系统类型(如通过platform.system()),避免硬编码路径,例如使用os.path.join拼接路径,确保在Windows与Unix下均能运行。
  • 错误降级:当某个采集指令不存在时(如lscpu在精简容器中缺失),脚本应使用subprocesstry/except捕获异常,并回退到/proc/cpuinfo读取,而非直接崩溃。

核心采集项:CPU、内存、磁盘、网络与进程

这五项是系统健康度的“黄金指标”,编写时需注意:

  • CPU:除了使用psutil库(Python)外,更底层的做法是解析/proc/stat,关键在于计算空闲时间的差值来获得实际使用率,避免瞬时峰值误报。
  • 内存:重点关注available而非free(部分内存被缓存占用),在Linux下可用grep MemAvailable /proc/meminfo
  • 磁盘必须包含inode使用率(执行df -i),因为inode耗尽会导致“空间充足但无法写入”的假故障。
  • 网络:采集TCP连接状态(如ss -s中的TIME_WAIT数量)比单纯监控流量更能反映DDoS攻击痕迹。
  • 进程:列出CPU或内存占用前5的进程,务必附带完整的命令行参数(args而非name),以识别恶意程序。

高级技巧:跨平台兼容(Linux/Windows)与权限处理

跨平台是脚本编写的高阶门槛,建议使用Go语言Python,它们内置跨平台库,若坚持用Shell,需通过uname -a区分平台并分支编写,获取系统启动时间:Linux下读取/proc/uptime,而Windows下需执行systeminfo | find "System Boot Time"

权限处理是安全脚本的痛点,绝不建议用sudo运行整个脚本(会留下大量认证日志),正确姿势是:将需要root权限的采集项(如读取/etc/shadow)拆分为独立子脚本,并在主脚本中通过setuidsudo -n(非交互式)调用,且要求目标机器配置NOPASSWD白名单。

自动化与报告生成:定时任务+结构化输出

单纯的print输出不利于后续分析,推荐生成JSONCSV格式文件,便于导入Elasticsearch或Grafana。

  • 定时执行:在crontab中设置*/10 * * * * /opt/collector.py -o /data/,实现每10分钟采集一次。
  • 报告进化:脚本应支持“差异对比”模式,将本次采集的dmesg错误数与基线文件对比,差异部分用红色[ALERT]标记,便于运维聚焦异常。

实战问答:解决编写过程中的五大常见坑

Q1:脚本在CentOS 7上正常,但在Ubuntu 20.04上执行报错“command not found”。 答:这是命令差异导致的,不要直接调用free -m,建议使用python3 -c "import psutil; print(psutil.virtual_memory())",若强制用Shell,请加一个“命令适配层”:CMD_FREE=$(command -v free || echo /usr/bin/free)

Q2:如何防止采集脚本被入侵者利用来窃取敏感信息? 答:禁止在脚本中明文写入密码或Token,敏感项(如解密密钥)应通过环境变量引用,且脚本需设置umask 077,确保生成的文件仅属主可读。

Q3:采集时间过长(超过10秒),导致定时任务重叠。 答:在脚本开头利用flock(Linux)或msvcrt(Windows)实现文件锁,如果锁未释放,则直接退出,避免并发写入数据文件导致损坏。

Q4:客户要求采集特定硬件序列号(如戴尔服务标签),但服务器是虚拟机。 答:使用dmidecode -s system-serial-number,但需注意虚拟机该值可能为空,脚本需增加逻辑:若为空则读取/sys/class/dmi/id/product_serial,再为空则输出Unknown

Q5:脚本输出时间戳时,如何保证全球多时区服务器的一致性? 答:强制使用UTC时间并注明时区,Python代码为datetime.now(timezone.utc).isoformat(),不要使用date命令的默认输出,避免因时差导致日志排序混乱。


编写系统信息收集脚本的本质是标准化 + 容错 + 清晰输出,不要试图一次采集所有信息,而是聚焦运维与安全的高频指标,最后问自己一个问题:如果这台机器被攻破,我的脚本能否在“脏环境”下依然运行?如果不行,请立即加入对LD_PRELOAD注入的检测和基础命令路径的哈希校验逻辑——这才是脚本脱胎换骨的关键。

抱歉,评论功能暂时关闭!