如何在ESXi虚拟机监控程序中开启Shell脚本执行命令的日志记录?
如何在ESXi虚拟机监控程序中开启Shell脚本执行命令的日志记录?
这个问题我在运维ESXi环境时也碰到过,默认情况下ESXi的shell.log确实只会记录交互式Shell里直接输入的命令——毕竟脚本执行属于非交互式会话,不会被系统默认的日志规则捕获。不过有几种实用的方法可以实现脚本内命令的日志记录,我给你详细说说:
方法一:修改脚本本身,内置日志追踪
最直接的方式是给脚本加上命令追踪和日志输出配置,步骤很简单:
- 在脚本开头添加
set -x,这个参数会让Shell把执行的每一条命令都打印出来; - 把追踪输出重定向到
shell.log或者你指定的日志文件。
修改后的脚本示例:
#!/bin/sh # 自定义日志格式,贴近原生shell.log的样式 export PS4='<164>$(date "+%Y-%m-%dT%H:%M:%SZ") $(hostname) shell[$$]: [root]: ' # 将命令追踪的输出追加到shell.log exec 2>> /var/log/shell.log # 开启命令追踪 set -x echo "Test" ls -la find / -name "*.log" -exec /bin/rm -rf {} \;
解释一下:
PS4变量定义了set -x输出的前缀格式,和原生shell.log的格式保持一致,方便后续查看;exec 2>> /var/log/shell.log把脚本的标准错误输出(set -x的内容会输出到stderr)追加到日志文件;set -x开启命令追踪,每条命令执行前都会把命令内容打印到日志。
方法二:执行脚本时强制开启日志(无需修改脚本)
如果不想改动原脚本,可以在执行的时候通过Shell参数强制开启追踪,并把输出定向到日志:
sh -x your_script.sh >> /var/log/shell.log 2>&1
-x参数开启命令追踪,2>&1把标准错误和标准输出都重定向到日志文件,这样脚本里的所有命令和输出都会被记录下来。
方法三:全局开启非交互式Shell的日志(进阶)
如果你希望所有非交互式脚本的执行命令都被记录,可以修改ESXi的Shell全局配置:
- 编辑
/etc/profile文件(这是全局环境变量配置文件); - 添加以下内容:
# 配置日志格式 export PS4='<164>$(date "+%Y-%m-%dT%H:%M:%SZ") $(hostname) shell[$$]: [root]: ' # 开启命令追踪并将输出追加到shell.log exec 2>> /var/log/shell.log set -x
不过要注意:这个配置会影响所有非交互式Shell会话,包括系统自带的脚本,可能会导致shell.log快速增大,建议配合ESXi的日志轮转功能一起使用。
额外注意事项
- 确保你有
/var/log/shell.log的写入权限,root用户默认没问题,普通用户需要提前授权; - 如果不需要记录脚本的输出内容,只需要命令本身,可以只重定向
set -x的输出(也就是标准错误),不用管标准输出。
备注:内容来源于stack exchange,提问作者Cool Guy
相关产品推荐
相关产品推荐

