2013-01-07 101 views
3

我一直在尋找一種方法來記錄一些關於命令歷史的更詳細的信息。我的主要目的是爲了在我們的應用程序中調試問題時創建粗略的服務器時間表,發佈命令的大致日誌。 這不是用於非常詳細的審計目的。我遇到了this post,它提出了一個很好的方法來修改PROMPT_COMMAND以增加有關每個命令的附加信息的history日誌。它建議添加以下到~/.bashrc文件:非交互式shell命令的歷史

export PROMPT_COMMAND='hpwd=$(history 1); hpwd="${hpwd# *[0-9]* }"; if [[ ${hpwd%% *} == "cd" ]]; then cwd=$OLDPWD; else cwd=$PWD; fi; hpwd="${hpwd% ### *} ### $cwd"; history -s "$hpwd"' 

這工作真棒,除了發出的PS1提示時,它纔會發生。有沒有一種方法可以增強這個功能以使用非交互式shell(我認爲這是正確的術語)?

例如,我想:

ssh host "ls | grep home" 

要創建ls | grep homehost條目爲好,但由於這是不是通過PS1提示鏈接的解決方案做達不到。

我已經看了一下auditd。這是一個很好的實用工具,但細節的程度遠遠超出我的需要。我本可以很容易地解析日誌,但是管道,重定向,循環變成了一場噩夢,可以合理地重建成類似於已經報告的東西。

回答

1

一個簡單的包裝ssh似乎是一個簡單的方法來實現這一點。

shout() { 
    local host 
    host=$1 
    shift 
    ssh "$host" <<____HERE 
     echo "[email protected]" >>\$HOME/.shout-history 
     bash -c "[email protected]" 
____HERE 
} 

或者,如果你想包裝在本地運行,

shout() { 
    local host 
    host=$1 
    shift 
    echo "[email protected]" >>$HOME/.shout-history 
    ssh "$host" "[email protected]" 
} 

我叫這個shout反對ssh它應該是,你知道的,安靜。另見this。當然,如果你是管理員,你可以簡單地將/usr/bin/ssh移動到某個模糊的地方,並強制你的用戶運行一個/usr/local/bin/ssh,其內容類似於上面的內容。很容易繞過一個有知識的用戶,但如果你真的很嚴厲,有辦法讓它變得更加困難。

如果您是遠程主機的管理員,則可以強制所有用戶運行/usr/local/bin/shout作爲其shell,例如,並使用或多或少類似的方式填充它。

#!/bin/bash 
echo "[email protected]" >>/home/root/im.in.ur.sh.reading.ur.seekrit.cmds.lol 
exec /bin/bash -c "[email protected]" 

只要確保抄本文件是世界可寫的但不是世界可讀的。

+0

這需要每個人都發出遠程命令來使用'喊'雖然,對吧?是否有基於主機的解決方案? – JaredC

+0

你可以在遠程主機上用類似的東西包裝登錄shell。如果你絕望,你可能會破解遠程'bash'或'sshd'來做日誌記錄。 – tripleee

+0

我對bash不太熟悉......是否有一些簡單的指導可供參考? – JaredC