今日私は私のbashの記録が完全に消去されたことを発見しました。ファイルを実行history -c
または削除しませんでした.bash_history
。.bash_history
ファイルの削除に加えてhistory -c
bash履歴を消去する方法は?
答え1
同時に、複数のbashインスタンスを閉じると履歴が消去される可能性がある既知の競合状態があります。これは、bash履歴ファイルを作成するときにロックが使用されないために発生します。
Chet Ramey(現在のbashマネージャ)が提供しました。良いまとめこの質問の条件は次のとおりです。
現在の(bash-4.3-devel)コードはエラーがないと仮定して次のように動作します(lib / readline / histfile.c:history_do_write()):
- 名前変更(ヒストファイル、ヒストファイル~)
- O_CREAT | O_TRUNCを使用してファイルを開きます。
- mallocバッファは、すべての履歴データを保持するのに十分な大きさです。
- 1回のwrite(2)呼び出しですべての履歴エントリを書き込む
- ファイルを閉じる
- 接続解除(ヒストファイル~)
bash-4.2コードは、履歴ファイルをバックアップしないことを除いて同じ方法で動作します。各シェルは終了時に同じことを行い、histappendが設定されていないと仮定します(設定が示すように)。
履歴ファイルの長さがゼロになる状況はいくつかあります。つまり、 malloc が失敗するか、書き込みが失敗する可能性があります。 bash-4.2では、この時点で切り捨てられた履歴ファイルで作業を実行するには遅すぎます。 bash-4.3では、古い履歴ファイルが復元されます。
このメーリングリストのトピックBug-bashでは、問題、考えられる解決策、およびこの問題に関する懸念に関する適切な議論が含まれています。
他の可能性もあります:
- ある時点で、
HISTSIZE
orはHISTFILESIZE
0に設定されます。 - ある時点で、readlineは
history-size
0に設定されます。 - 誰かが意図的にまたは意図せずに(
> "$HISTFILE"
または同様の手段を介して)bashの記録を消去しました。
後者の場合、誰かが自分のアカウントにアクセスしていないか、おおよその方法で自分の痕跡を隠そうとしているかどうかを確認したい場合があります。インストールしたプロセス会計および/または監査ソフトウェアがある場合(またはCentOS / RHELで)確認してくださいlast
。/var/log/auth
/var/log/secure
答え2
誤ってbashレコードを削除した方法:
私は最初の原則に従って私自身の代替ターミナルreadlineスクリプトを振りました。https://tiswww.cwru.edu/php/chet/readline/rluserman.html
その後、端末でテストします。 GNU Readline には履歴サイズと履歴保存のガイドラインが組み込まれているため、すべての履歴が消去されるように履歴サイズをデフォルト値に設定できます。
メモリに保存されている場合の履歴の復元:
再起動する前にキャプチャしたり、削除する前に端末を開いたままにした場合は、メモリ内の履歴を見つけることができます。history | cut -c 8- > histback_user1.txt
開いているすべての端末とすべてのユーザーに対して実行されます。拡張履歴を含むファイルが作成されたら~/.bash_history
に置き換えることができますhistback_user1.txt
。また、最近システムにログインしたすべてのユーザーの履歴とルート履歴を確認できます。多くの状況で、誤ってbashレコードを消去するのは簡単です。したがって、履歴が失われないようにするには、毎日のバックアップスクリプトが必要です。