2017-08-12 126 views
0

作为系统管理员,我试图模拟用户在虚拟机上进行测试日志文件监控。是否可以使用pexpect生成bash shell命令,该命令将显示在bash历史记录中?

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

我曾想过直接写入bash历史,但宁愿更准确地模拟用户的行为。原因是bash历史不是唯一正在监视的日志文件,如果同一事件的日志保持同步,则会更好。

详细 我在CentOS Linux的工作释放1611年7月3日 的Python 2.7.5安装

我已经尝试使用pexpect.run( 'LS')或pexpect.spawn( 'LS') ,'ls'不会在任何命令中显示在bash历史记录中。

+0

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

回答

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

0

简短的答案似乎是不,你不能这样做与pexpect。

Auditd是跟踪用户输入的一种可能的替代方法,但我还没有想出如何让它记录'ls'和'cd'等命令,因为它们不会调用系统execve()命令。我发现的最好的工作是使用脚本命令,它打开另一个交互式终端,其中记录了在提示中输入的每个命令。您可以使用脚本命令输出的文件(默认情况下是打字稿)来记录所有用户命令。