2011-08-25 8 views
5

私は、好奇心のために、bashスクリプトを記述することが可能であれば、Bash/SSHセッションで実行されるすべてのコマンドを記録することができますか?私はhistoryはすべてのコマンドを実行するログを想定しているが、非常に信頼性の低いようです!Bash Command Logger

私は今朝起きていて、ユーザがターミナルで実行したことをログに記録するが、すべてのコマンドを正しく実行しない次のbashスクリプトを思いついた。

prompt_read() { 
    echo -n “$(whoami)@$(hostname):$(pwd)~$ “ 
    read userinput 
} 

prompt_read 

while :; do 
    if [[ $userinput != exit ]]; then 
    logger "logit $userinput" 
    bash -c "$userinput" 
    prompt_read 
    else 
    kill -1 $PPID 
    fi 
done 

history

乾杯

答えて

8

歴史はあなたに信頼できないと思われる、それが唯一の終わりに歴史に書き込みを行うためである理由よりも、確実に、より良く、よりコマンドをログに記録するものを認識して誰ですBASHセッションでは、コマンドを失う可能性があります。歴史を作るだろう、あなたのPROMPT_COMMANDhistory -aでの設定、

HISTFILESIZE=10000 # how many lines of history to store in the history file 

HISTSIZE=10000 # how many lines of history to store in a session (I think) 

HISTCONTROL=ignoredups # ignore duplicate commands 

shopt -s histappend # append history, rather than having sessions obliterate existing history 
PROMPT_COMMAND="history -a;$PROMPT_COMMAND" 

最後の数は重要なものではなく、後のセッションよりも、すぐに追加します。

私は私のbashプロファイルにいくつかのものを持っています。そして shopt -s histappendを設定すると、bashセッションは既存の履歴を上書きするのではなく、履歴ファイルに追加されます。

いくつかの詳細情報:これは、あなたにとって有用である場合http://linuxcommando.blogspot.com/2007/11/keeping-command-history-across-multiple.html

また、あなたがHISTFILE環境変数を使用して、特定のbashのセッションで使用履歴ファイルの名前を変更することができます。

+1

+1、btwまた、ヒストリファイルごとに「HISTFILE」を設定することもできます。 – Hasturkun

+0

@ Hasturkun - それに言及してくれてありがとう。 – birryree

4

は、スクリプトをチェックアウト:http://bashshell.net/commands/using-the-script-command/

それをファイルに、端末に表示されるすべてのものを記録し、IIRCそれが記録されたセッションを再生することができます。

ログイン時にすべてを記録できるように、これをユーザーのシェルとして設定できます。

+0

再生するには、['scriptreplay'](http://manpages.ubuntu.com/manpages/intrepid/man1/scriptreplay.1.html)が必要です。 – birryree

2

hereスクリプトは、パッチや特別な実行可能ツールを使用せずに、すべての 'bash'コマンド/組み込み関数をテキストファイルまたは 'syslog'サーバーに記録することができます。

syslogを使わずに直接ログファイルに書き込むこともできます。

「bash」の初期化時に一度呼び出す必要があるシンプルなシェルスクリプトであるため、展開が非常に簡単です。