閉じる

Bashの操作ログを自動保存する:scriptコマンドの活用と効率的な記録方法

LinuxやmacOSなど、Unix系システムのターミナルで作業を行う際、どのような操作を行ったかを正確に記録しておくことは非常に重要です。

システム構築の証跡管理や、トラブルシューティング時の原因究明において、過去のコマンド実行履歴とその出力結果は貴重な情報源となります。

標準的なhistoryコマンドでは実行したコマンドラインのみが記録されますが、画面に表示された内容すべてを保存するには不十分です。

そこで活用したいのが、ターミナルセッションのすべてをテキストファイルとして保存できる「script」コマンドです。

本記事では、Bash環境におけるscriptコマンドの基礎から、実用的な自動保存の設定、効率的なログ管理の方法までを詳しく解説します。

scriptコマンドの基本概念とメリット

scriptコマンドは、ターミナルに表示されるすべての内容を指定したファイルに書き出すためのツールです。

ユーザーが入力したコマンドはもちろん、それに対するシステムの応答やエラーメッセージ、対話型プログラムの挙動まで余すことなく記録されます。

多くのLinuxディストリビューションには標準でインストールされており、追加のパッケージ導入なしにすぐ利用できる点が大きな強みです。

作業ログを取得する重要性

サーバー構築や設定変更の際、後から「どの手順でミスをしたか」を確認するためには、詳細なログが欠かせません。

特に複数人でシステムを管理している環境では、誰がどのような意図で操作したかを可視化することで、運用の透明性が高まります。

また、スクリプトの実行結果をエビデンスとして残す必要がある開発現場においても、scriptコマンドは標準的な手法として定着しています。

他の記録方法との違い

ターミナルのログを保存する方法はいくつかありますが、scriptコマンドには独自の特徴があります。

代表的な他の方法と比較した表を以下に示します。

手法記録される内容メリットデメリット
historyコマンド実行コマンドのみ手軽に確認できる出力結果が残らない
リダイレクト(>)標準出力のみ特定のコマンドに有効対話的な操作に向かない
scriptコマンドすべての送受信内容完全な再現性が得られる制御コードが含まれる場合がある

scriptコマンドの基本的な使い方

まずは、最もシンプルにscriptコマンドを開始する方法を確認しましょう。

引数なしで実行することも可能ですが、基本的には保存するファイル名を指定して起動します。

Shell
# ログの記録を開始する
script mysession.log
実行結果
スクリプトを開始しました。ファイルは mysession.log です。

このコマンドを実行した瞬間から、新しいシェルが起動し、すべての入出力の記録が始まります。

記録を終了したい場合は、exitコマンドを入力するか、Ctrl+Dを押下します。

Shell
# 記録を終了する
exit
実行結果
スクリプトを終了しました。ファイルは mysession.log です。

追記モードでの利用(-aオプション)

デフォルトでは、既存のファイルがある場合に上書きされてしまいます。

既存のログの末尾に記録を追加したい場合は、「-a」オプション(append)を使用するのが鉄則です。

Shell
# 既存のファイルに追記する
script -a mysession.log

リアルタイムでの書き込み(-fオプション)

通常、ログはバッファに蓄積され、一定量溜まってからファイルへ書き出されます。

作業がクラッシュした場合などに備えて、常に最新の状態をファイルに反映させたい場合は-f(flush)オプションを併用します。

これにより、別の端末からtail -fコマンドで作業をリアルタイム監視することも可能になります。

Bash起動時にログ保存を自動化する方法

手動でscriptコマンドを打つのを忘れてしまうのを防ぐため、ログイン時に自動的に記録を開始させる設定が有効です。

この設定を行う際は、無限ループに陥らないように慎重に記述する必要があります。

.bashrcへの記述例

以下のコードを~/.bashrcの末尾に追記することで、ターミナル起動時に自動でログの保存が開始されます。

Shell
# scriptコマンドの二重起動を防ぎつつ自動開始
if [ -z "$SCRIPT_LOG_STARTED" ]; then
    export SCRIPT_LOG_STARTED=1
    # ログ保存用ディレクトリを作成
    mkdir -p ~/terminal-logs
    # 日時をファイル名に含めて実行
    script -a ~/terminal-logs/session_$(date +%Y%m%d_%H%M%S).log
    exit
fi

ここでは、環境変数SCRIPT_LOG_STARTEDを使用して、scriptコマンドによって新しく生成されたシェルの中で再度scriptコマンドが実行されるのを防いでいます。

また、exitを記述しておくことで、記録を終了した際(exitした際)に親のシェルも同時に閉じるように設定しています。

ファイル名の動的生成

上記の例では、dateコマンドを利用して、起動時刻をファイル名に付与しています。

%Y%m%d_%H%M%Sというフォーマットを使用することで、ファイルが名前順に正しくソートされるため、管理が非常に楽になります。

数ヶ月にわたる長期の運用プロジェクトなどでは、このようにタイムスタンプ付きのファイル名で保存することを強く推奨します。

高度な活用法:再生機能とタイミング情報

scriptコマンドには、単にテキストとしてログを残すだけでなく、当時の作業のスピード感を再現する「再生機能」があります。

これを利用するためには、タイミング情報を保存するためのオプションを付けて実行する必要があります。

タイミングファイルの作成

--timingオプション(または環境により-t)を使用して、操作の間隔を記録します。

Shell
# タイミング情報と共に記録
script --timing=time.txt mysession.log

これにより、どのコマンドをどのタイミングで入力したか、出力に何秒かかったかという時間軸の情報がtime.txtに保存されます。

scriptreplayによる作業の再現

保存されたログとタイミング情報を使えば、まるで動画を見ているかのように作業を再現できます。

Shell
# 作業内容を再生する
scriptreplay --timing=time.txt mysession.log

これは教育用途や、不具合の再現確認において非常に効果的です。

コマンドの結果だけでなく、操作の「間」や「試行錯誤」のプロセスを共有できる点は、他のログツールにはないメリットです。

運用上の注意点とベストプラクティス

scriptコマンドは強力ですが、運用にあたってはいくつかの注意点が存在します。

これらを理解しておくことで、ログの肥大化やセキュリティ上のトラブルを回避できます。

制御文字とバイナリデータの扱い

scriptコマンドは、ターミナルの制御文字(色付け、カーソルの移動、バックスペースなど)もそのまま記録します。

そのため、lesscatでログファイルを見たときに、表示が崩れたり読みにくくなったりすることがあります。

ログをきれいなテキストとして閲覧したい場合は、colコマンドを使用して制御文字を除去する手法が一般的です。

Shell
# 制御文字を除去して読みやすくする
col -bp < mysession.log > clean_session.txt

セキュリティとプライバシー

最も注意すべきは、パスワードなどの機密情報の露出です。

パスワード入力時にアスタリスクが表示されない場合でも、内部的には制御文字として記録される可能性があります。

また、データベースへの接続クエリに機密情報を含めている場合、それらもすべてプレーンテキストでファイルに保存されます。

共有サーバーなどでログを保存する場合は、ログファイル自体のパーミッションを600(所有者のみ読み書き可能)に設定し、第三者に閲覧されないように徹底してください。

ディスク容量の管理

自動保存を有効にしていると、長時間の作業や大量の出力を伴うコマンドによって、ログファイルが巨大化することがあります。

定期的に古いログを圧縮(gzip)したり、一定期間を過ぎたファイルを削除したりする運用ルールを検討しましょう。

たとえば、findコマンドとcronを組み合わせて、30日以上前のログを自動削除するような仕組みを導入すると管理が自動化できます。

Shell
# 30日以上前のログファイルを削除する例
find ~/terminal-logs/ -name "*.log" -mtime +30 -exec rm {} \;

まとめ

Bashにおけるscriptコマンドは、シンプルながらも強力な作業記録ツールです。

単なるコマンド履歴を超えて、ターミナルで起きた「事実」をそのまま保存できる特性は、プロフェッショナルな現場において大きな安心感をもたらします。

導入は非常に簡単であり、設定一つで日々の作業ログを自動化することも可能です。

今回解説した自動保存設定やタイミング情報の活用、そしてセキュリティへの配慮を組み合わせることで、より高度な開発・運用環境を構築できるでしょう。

まずは重要な作業の前だけでも、scriptコマンドを打ち込む習慣をつけてみてはいかがでしょうか。

正確な記録を残すことは、未来の自分やチームメンバーを助けるための最良の投資となります。

URLをコピーしました!