bashでの操作ログを取りたいと思っていろいろ調べた結果、scriptコマンドが一番自分のイメージにあっている気がする

自分が見た中ではログを取る方法は6個あった

1.history

2.syslogというbashが持つログ機能

3.Snoopy Loggerというパッケージ

4.auditというlinux標準の機能

5.psacctサービス

6.scriptコマンド

1~5はコマンド履歴だけしか保存できない一方、6はコマンドの実行結果まで表示するので、scriptコマンドが一番いい気がした

scriptと打つとログの記録が始まる。子プロセスとして、bashを実行しており、そのbashを実行中のすべてのコマンドとその標準出力、標準エラー出力を記録する。bashを閉じればログの記録が止まり、ログファイルが作成される。デフォルトではhistoryと同じく、bashを閉じないとログが作成されない。また、デフォルトではログファイル名はtypescript。script ファイル名でログファイル名を指定して実行できる。すでに同名のファイルがあると上書きする。

scriptの欠点として、ファイルにカラーコード、エスケープシーケンスがかなり多く含まれていて、普通にcat,less,vimなどで見ようとするとかなり見づらくなることが多いことがある。他のサイトでいろいろ対策を見ましたが自分の場合、less -r で開くと一番きれいに読めた。

less -rだともう一つ欠点が生まれて、ログにvimによるファイルの編集が入ってしまうとログを正常に見られなくなる。(vimだとかなり見づらいが、バグらない)vimだけログから外すということは出来ないらしい。ただ、実行したいコマンドの前にscript -cを入れると、そのコマンドだけログに残すことができるので、vim以外の全てのコマンドでそれをすればログファイルからvimだけ外すことができる。 ちなみに、vimの履歴を見たい場合、:changes等でできるっぽい(自分はあまり使い方がよくわかってない)


2018/01/27追記

というか、2つシェルを開いて、1つはvim用(scriptを実行しない)、もう1つはそれ以外のコマンドを実行する用(script実行する)という風にすればいい気がする sshで接続する場合は2回接続しなくちゃいけなくてめんどくさいけれど毎回script -cやるとかよりはましかな

ちなみにターミナルマルチプレクサとかで1つのターミナルで複数のシェル開けば接続の手間省けるのでは?と思ったけれど、自分が試した環境(opensuse+tmux)ではscriptコマンドを実行したらエラーが出て、コマンドが打てなくなるというバグが発生した…

script: cannot set signal handler: Function not implemented


・scriptの主要なオプション

-c コマンド …指定したコマンドだけログに残す(複数指定は出来ない)

-a …同名ファイルがあっても上書きせず追記する

-f …デフォルトではbashを閉じないとログファイルへの書き込みが発生しないが、コマンド実行ごとに書き込むようにする

-q …デフォルトではログファイルに、ログの記録開始、終了メーセージが入るが、終了メッセージのみをなくす

-t …ログにタイムスタンプ含める

関連記事