【问题标题】:Is it possible to use pexpect to generate bash shell commands that will show up in bash history?是否可以使用 pexpect 生成将显示在 bash 历史记录中的 bash shell 命令?
【发布时间】:2017-08-12 03:05:57
【问题描述】:

作为系统管理员,我正在尝试在虚拟机上模拟用户以测试日志文件监控。

模拟用户将自动执行应显示在 bash 历史记录中的各种任务,“ls”、“cd”、“touch”等。重要的是它们显示在 bash 历史记录中,因为 bash 历史记录已被记录.

我曾考虑直接写入 bash 历史记录,但更愿意更准确地模拟用户行为。原因是 bash 历史记录不是唯一被监视的日志文件,如果同一事件的日志保持同步会更好。

详情 我正在开发 CentOS Linux 版本 7.3.1611 Python 2.7.5 已安装

我已经尝试过使用 pexpect.run('ls') 或 pexpect.spawn('ls'),'ls' 不会出现在任何一个命令的 bash 历史记录中。

【问题讨论】:

  • ephemient 在他的回答中提到了这一点,但在这里值得强调的是:bash 历史不是审计工具; shell 用户可以方便地重复过去执行的类似命令。历史也是每个会话,而expect.spawn 启动一个新的shell。该命令被添加到该 shell 的历史记录中,但是当 shell 退出时该历史记录消失了。

标签: python linux bash shell pexpect


【解决方案1】:

Bash 日志记录仅适用于交互式 shell。这将打开一个与 Bash 的交互式会话并在其中运行 ls,但如果将 .bashrc 自定义为更改 PS1,它可能会失败。

child = pexpect.spawn('bash')
child.expect(r'\$')
child.sendline('ls')
child.expect(r'\$')
child.close()

话虽如此,Bash 历史很容易被绕过。它只写在交互式会话结束时,可以在会话期间更改,所以

$ rm very_important_file
$ history -c

$ kill -9 $$

不会出现在.bash_history 中。即使在restricted Bash 中也是可能的。

如果您需要更可靠的东西,我建议您设置system auditing

【讨论】:

    【解决方案2】:

    简短的回答似乎是否定的,你不能用 pexpect 做到这一点。

    Auditd 是跟踪用户输入的一种可能替代方法,但我还没有弄清楚如何让它记录诸如“ls”和“cd”之类的命令,因为它们不调用系统 execve() 命令。我发现最好的解决方法是使用脚本命令打开另一个交互式终端,在该终端中记录在提示中输入的每个命令。您可以使用脚本命令输出到的文件(默认为 typescript)来记录所有用户命令。

    【讨论】:

      猜你喜欢
      • 2019-10-22
      • 2012-01-25
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 2011-09-22
      • 1970-01-01
      相关资源
      最近更新 更多