はじめに
LinuxDesktopを使っていて少し気になったことがあります。それはターミナルのログが保存できていないことです。今までWindowsからTeraTermでsshをしていたため、TeraTermでログを自動保存していました。ターミナルを開いたときにLinuxDesktopでログを保存するようにしましょう。
やってみたこと
いつも使用しているユーザでタームなるを起動した際に、ログを取るようにしましょう。
~/.bashrcにログ取得スクリプトを書き込んでおけば、起動の度に取得してくれます。
おあつらえむきなコマンドがあります。それはscriptコマンドです。
このコマンドはscriptコマンドからexitを入力するまでのターミナル操作内容を記録するコマンドです。
以下のようなコマンドでログは取得できそうです。
script "$HOME/log/history/$(date +%Y%m%d_%H%M%S_%N)_$(whoami).log"早速、.bashrcにといきたいところですが、このまま追加してしまうと以下の画像のようにループします。
原因は script が新しいシェルを起動し、そのシェルでも .bashrc が読まれて、また script が実行されるためです。なので、すでに script 配下のシェルならscriptを実行しないようにしておくのがよいです。 SCRIPT_LOGGING という自前の環境変数で制御するようにしてみましょう。最初の .bashrc では空なので script を起動し、その際に SCRIPT_LOGGING=1 が子シェルへ引き継がれます。script 内で起動された bash が再び .bashrc を読んでも、今度は条件に入らないため1回で止まります。
次に、起動するシェルの種類も指定しておきましょう。対話シェルの場合のみログを取得するようにしてきます。$- には、現在のシェルで有効になっているオプションが入っています。対話シェルの場合は i が含まれれます。bash script.shのようにスクリプト実行用として起動された非対話シェルでは i が付かないため、ログ取得処理は走りません。
また、scriptコマンドは画面にはリアルタイムで表示する一方、ログファイルへの書き込みはバッファリングされることがあります。-f(flush)オプションを付与して各書き込みのたびにログファイルをflushするようにしましょう。リアルタイム性が向上します。
そうと決まれば早速記載していきましょう。~/.bashrcを編集して以下を追加します。
vi ~/.bashrc##対話シェルの操作ログを保存
if [[ $- == *i* ]] && [ -z "$SCRIPT_LOGGING" ]; then
export SCRIPT_LOGGING=1
mkdir -p "$HOME/log/history"
exec script -f "$HOME/log/history/$(date +%Y%m%d_%H%M%S_%N)_$(whoami).log"
fi実際に設定を行い新しいターミナルを起動するとこのような形でメッセージが出ると共にログも出力されます。

script に-fを付与した場合は「bashのコマンド履歴」ではなく、端末に表示された内容そのものを記録する仕組みです。したがって、入力したコマンドだけでなく、その実行結果やプロンプトも含めて保存されます。また、矢印キーやTab補完、画面を書き換えるようなコマンドなどでは制御文字もログに入ることがあるそうです。
まとめ
今回、scriptコマンドと.bashrcを利用して、Ubuntuでターミナルを起動した際に操作ログを自動保存するようにしてみました。
これまではWindowsからTeraTermでSSH接続することが多く、ログの自動保存が当たり前になっていました。Ubuntu Desktopを直接使うようになってからも、同じように「ターミナルを開けば勝手にログが残る」環境にできたので、ログの取り忘れを気にする必要がなくなりました。トラブルが発生したときに「さっき何のコマンドを実行したっけ?」となっても、入力したコマンドだけでなく、そのときの実行結果まで後から確認できます。
設定自体は.bashrcに数行追加するだけなので、Ubuntuを普段使いしている方は設定しておくと、いざというときに役立つかもしれません。
その他
Linux関連の記事はこちら!
「 Linux 」 一覧
https://doronuma-se.com/archives/category/linux
