のファイルにbash_historyを書き込む
要件は、コマンドが実行された特定の日時を含むファイルにコマンドライン履歴をキャプチャすることです。
以下のスクリプトは、日付と時刻の履歴をキャプチャしますが、古いコマンドに現在の日付と時刻も割り当てます。また、スクリプトを拡張して、履歴出力ファイルの増分バックアップを作成したいと思います。
#!/bin/bash . ~/.bash_profile HISTFILE=~/.bash_history set -o history history >/home/user/hist_`date "+%d%b%y%T"`
コメント
- 'これにシェル履歴を使用しないでください。アカウンティングまたはsudo(およびlog sudoコマンド)を使用します。
- ファイル内の履歴キャプチャにアカウンティングまたはsudoを使用する方法
- sudoは、履歴(およびtty出力)をキャプチャするように構成できます。 )ファイルに(またはsyslog経由で)。 "アカウンティング"とはどういう意味ですか?
- @SunLynx、入力したすべてのコマンドをログに記録するにはどうすればよいですか
回答
必要でしたが、bash
を取得して、履歴の各行にタイムスタンプを自動的に追加できます。たとえば、次のように設定するだけです。
HISTTIMEFORMAT="%d%b%y%T "
history
コマンド引数なしは、次のような履歴エントリを表示します:
23Jul1515:48:14 ls -ld .
history -w
コマンドは、常に履歴ファイルを次の内部形式で書き込みます。
#1437659315 ls -ld .
ie 2行の最初の行は、コマンドと混同されないように、#
を前に付けて、「エポック以降」(つまり、1970年1月1日)の時間を秒単位で保持します。
コメント
- 上記のスクリプトは機能しますが、すべてのコマンドに現在の日付を割り当てます。また、すべてのコマンドの後に1つの番号が生成されますが、これは'必要ありません。誰かが助けてくれるなら、それは本当に役に立ちます
- " 1つの数字が"。取得したいファイルとその内容の例を使用して、元の質問を編集できますか?
- 598 05Jul15 00:00:01less .bash_history 599 05Jul15 00:00:01#1435987168 600 05Jul15 00: 00:01man rsync 601 05Jul15 00:00:01#1435988263 602 05Jul15 00:00:01ls -lrt / srv / cloud- * 603 05Jul15 00:00:01#1435988281 604 05Jul15 00:00:01crontab -l 605 05Jul15 00: 00:01#1435988290 606 05Jul15 00:00:01cat /srv/cloud-user_hist.sh
- このメッセージが生成するように
- コメントでこれを読むのは難しいです。コメントを削除し、最初に書いた質問を編集してください。
回答
bashには、各コマンドでタイムスタンプを記録するようにbashに指示するオプションがあります。これを行うには、環境変数HISTTIMEFORMAT
に有用な値を割り当てます。 bash
のマンページから:
この変数が設定されていてnullでない場合、その値は
strftime(3)
のフォーマット文字列。履歴ビルトインによって表示される各履歴エントリに関連付けられたタイムスタンプを出力します。この変数が設定されている場合、タイムスタンプは履歴ファイルに書き込まれるため、シェルセッション間で保持されます。これは、履歴コメント文字を使用して、タイムスタンプを他の履歴行と区別します。
私の環境では、
コマンドを簡単に並べ替えることができ(%s
は秒単位のタイムスタンプ)、人間が読める形式になっています。シェルでhistory
と入力すると、次のように表示されます。
3 1437664568 (17:16:08):man bash 4 1437664699 (17:18:19):history
編集:OPの質問完全には回答されていません。
また、スクリプトを拡張して、履歴出力ファイルの増分バックアップを取得したいと思います
履歴ファイルの「増分バックアップ」の意味がわかりません。おそらく、履歴を定期的にバックアップしたいだけです。いくつかの方法があります。
- PROMPT_COMMAND変数を
history -a
に設定して、呼び出しのたびに(ログアウトを待つのではなく)履歴コマンドを継続的に更新します。 - DEBUGをトラップします。定義した関数でシグナルを送信します。コマンドが入力されるたびに関数が呼び出されます。関数内からすべてを実行できます(PROMPT_COMMANDよりも少し信頼性があります)。
- 定期的にコピー/アーカイブするcronjob履歴ファイル。
コメント
- 提案をありがとうございますが、'上記でテストしました。歴史について詳しく教えてください-a。シェルスクリプトは正常に機能していますが、タイムスタンプが間違っています。これは1つの問題であり、もう1つは#で始まるすべてのコマンドの後に1つの番号です。 例: #1435987168。
- 履歴ファイルの
#1435987168
はタイムスタンプです! これをユーザーフレンドリーな形式に変換するには、次のような2つの方法があります。履歴ファイルをhistory -n _filename_
でbashにロードしてから、history
。 または、perl -lane '{ /^#(\d+)$/&&print "#".localtime($1) or print;}' $HISTFILE
のように実行して、タイムスタンプ付きの履歴を表示することもできます。 したがって、'タイムスタンプは正しいと思われますが、ロケールまたはタイムゾーンに問題がありますか? -
history -a
?? マニュアルページは少し誤解を招くものです。 $ HISTFILEで指定されたファイルに現在のセッション履歴を追加します。 後続の呼び出しでは、最後の呼び出し以降に生成された履歴が追加されます('ファイル全体が何度も上書きされることはありません)