2017-08-12 108 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()命令。我發現的最好的工作是使用腳本命令,它打開另一個交互式終端,其中記錄了在提示中輸入的每個命令。您可以使用腳本命令輸出的文件(默認情況下是打字稿)來記錄所有用戶命令。