You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

AIX服务器目录中识别被调用可执行文件的自动化方法咨询

如何在AIX上自动化识别被执行的可执行文件(含子目录重名场景)

没问题!在AIX环境下要找出被第三方应用调用的可执行文件(包括shell脚本和二进制程序),还要处理子目录重名的麻烦,这几个自动化方案绝对实用,我按可靠性和覆盖范围给你梳理清楚:

方法1:用AIX审计系统(Audit)追踪执行事件

这是最靠谱的方案,因为它能完整记录所有执行操作,连文件的完整路径都不放过,完美解决重名问题。

操作步骤:

  1. 先搞定审计服务和规则:
    • 先看看审计开了没:audit query
    • 没开的话启动服务:startsrc -s auditd
    • 添加追踪执行操作的规则,要是只想盯某个目标目录(比如/your/target/dir),就这么配:
      auditconfig -setflags +exec
      auditconfig -setnaflags +exec
      # 只审计目标目录下的文件执行事件
      auditconfig -create obj /your/target/dir -flags exec
      
  2. 提取并解析审计日志:
    • 审计日志默认存在/var/audit,用auditselect过滤出执行事件:
      auditselect -e 'event == EXEC' /var/audit/* > executed_files.log
      
    • 再用praudit格式化日志,把完整路径抠出来去重:
      praudit -x executed_files.log | grep -o '"path": "[^"]*"' | cut -d '"' -f4 | sort -u > unique_executed_paths.txt
      
    最后生成的unique_executed_paths.txt里就是所有被执行过的文件的完整路径,谁是谁一目了然,再也不怕重名了。

方法2:用lsof实时抓当前运行的可执行文件

如果只是想看看此刻正在运行的进程对应的可执行文件,这个方法快得很,适合做个快照。

直接跑这个命令:

lsof -c '.' | grep -E '(REG|DIR)' | grep -v 'txt' | awk '{print $9}' | grep '^/your/target/dir' | sort -u
  • 简单解释下:lsof -c '.'列出所有进程打开的文件,过滤出普通文件/目录,排除掉txt类型避免混淆,然后提取文件路径,只保留目标目录下的,最后去重输出。
  • 缺点是只能抓当前正在跑的,那些执行完就退出的脚本或者程序就抓不到了。

方法3:用AIX记账系统(acct)记录所有执行命令

AIX自带的记账系统能记录所有用户和进程执行过的命令,适合长期统计,就是需要做点额外的匹配工作。

操作步骤:

  1. 先启动记账服务:
    startsrc -s acctd
    
  2. 提取记录并匹配路径:
    • 记账日志在/var/adm/pacct,用lastcomm解析出所有执行过的命令名:
      lastcomm | awk '{print $1}' | sort -u > executed_commands.txt
      
    • 因为这里只有命令名,没有路径,所以得遍历目标目录把命令和路径对应起来:
      # 遍历目标目录下所有可执行文件,匹配命令名
      find /your/target/dir -type f -executable | while read path; do
        cmd=$(basename "$path")
        if grep -qx "$cmd" executed_commands.txt; then
          echo "$path" >> matched_executed_paths.txt
        fi
      done
      
    这个方法的小问题是,如果不同目录有重名命令,会把所有重名的都列出来,不过可以结合其他方法交叉验证一下。

方法4:写个定时脚本监控进程列表

要是系统级工具用不了,那就自己整个简单的定时脚本,定期抓进程列表,提取可执行文件路径。

示例脚本(monitor_exec.sh):

#!/bin/ksh
TARGET_DIR="/your/target/dir"
LOG_FILE="/var/log/executed_files.log"

# 抓取所有进程的可执行文件路径,只保留目标目录下的
ps -ef | awk '{print $8}' | grep "^$TARGET_DIR" | sort -u >> "$LOG_FILE"

# 定期去重,避免日志重复
sort -u "$LOG_FILE" -o "$LOG_FILE"
  • 然后用crontab设置定时执行,比如每5分钟跑一次:
    */5 * * * * /path/to/monitor_exec.sh
    
  • 这个方法简单,但容易漏掉那些运行时间极短的程序(比如几秒钟就执行完的脚本)。

处理重名文件的核心要点

不管用哪种方法,一定要记录并输出完整文件路径,别只记文件名!只有完整路径才能区分不同子目录下的重名文件,比如审计日志提取的路径、lsof输出的第9列都是完整路径,这才是解决重名问题的关键。


内容的提问来源于stack exchange,提问作者Balaji Ramesh

火山引擎 最新活动