bashで入力履歴も出力履歴も保存する


bash上でさまざまな操作をして、後になってから何をしたかわからなくなったり、あるいはどんな数値を見たか忘れてしまったりしたときはありませんか? そんなときのためのtipsです。自分が行った研究の記録をつける用途で考えているため、意図的なログの抹消への対策はしていません。サーバ管理用途で利用者の操作を監視したいといった目的には不向きです。

入力履歴の保存(.bashrcのバックアップ)

~/.bash_logout
DATETIME=`date +%Y%m%d%H%M%S`

history > ~/log/bash_history/$DATETIME
rm ~/.bash_history

と追記。もともとのbash_historyは消さなくてもよい(そうしたほうが前回ログイン時のコマンドをたどれる)ものの、ここではログの簡素化のため消してしまっています。もう少しうまい処理をすれば昨日の分だけは残しておくとかできるでしょうが……。セッションが正常に終了せず.bash_logoutが実行されなかった場合は次回まで持ち越されて保存されるのでログを失うリスクは大きくないはずです。

  • ある日のログファイルだけ一覧したければcat ~/log/bash_history/20170101*
  • ある日に実行したコマンドを一覧したければcat ~/log/bash_history/* | grep 20170101とでも(これはhistoryの中身にもタイムスタンプをつけている前提。以下参照)

Historyの各エントリにもタイムスタンプを表示する

~/.bashrc
export HISTTIMEFORMAT="%Y%m%d%H%M%S "

参考:
1. https://askubuntu.com/questions/391082/how-to-see-time-stamps-in-bash-history
2. 日付の書式はman date

.bash_historyを複数のターミナル間で共有する(お好みで)

~/.bashrc
function share_history {
    history -a
    history -c
    history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend
export HISTSIZE=9999

参考:
1. http://iandeth.dyndns.org/mt/ian/archives/000651.html
2. https://unix.stackexchange.com/questions/1288/preserve-bash-history-in-multiple-terminal-windows

出力履歴の保存(scriptコマンド利用)

~/.bashrc
if [ "$SSH_TTY" != "" ]; then # scpが使えなくなる問題を回避するためのおまじない。
    P_PROC=`ps aux | grep $PPID | grep sshd | awk '{print $11}'` # 子プロセスでは実行しない
    if [ "$P_PROC" = "sshd:" ]; then
        script -f -q ~/log/script/`date '+%Y%m%d%H%M%S'`
    fi

やってみるとわかりますが、このログは見づらく量も膨大になるので、特段必要があるときにがんばって検索してやる程度のものになるでしょう。それでもあるのとないのとでは大違いです。また、sshで接続していることを前提としているのでこのままではローカルでは走りません。

参考:
1. http://blog.mogya.com/2008/01/ssh.html
2. https://stackoverflow.com/questions/12440287/scp-doesnt-work-when-echo-in-bashrc