linux – Bash の履歴ファイルから特定の行を削除する

bash command-history history linux

historyのデータベースから特定の行を削除するには?

  159  None  2012-01-31


ベストアンサー

現在の履歴がディスクにコミットされるように、ログアウトしてバックインするか、history -aを実行する必要があります

あとはファイル~/.bash_historyを編集するだけです

124  cYrus  2012-01-31


コマンドラインを使用して、2つのステップで履歴ファイルからの削除を実現することができます

  1. history -d <line_number>と入力すると、メモリ上の履歴から指定した行を削除する
  2. history -wと入力すると、現在のメモリ内の履歴が~/.bash_historyファイルに書き込まれます

この2つのステップで、メモリ内の履歴と.bash_historyファイルからもその行を永久に削除します

153  Paperlantern  2012-01-31


そもそもコマンドが履歴に追加されないようにするには、環境変数 HISTCONTROL がコロンで区切られた値の中に ignorespace を含んでいることを確認してください (例: .bashrc に追加)

$ export HISTCONTROL=ignorespace

これにより、先頭にスペースがあるコマンドが履歴に追加されるのを防ぐことができます。その後、実行することで履歴を完全にクリアすることができます

$  history -c -w
^-- additional space character

41  tao  2012-02-01


まず第一に、これから発行しようとしているコマンドが機密性の高いものであったり、安全でないものであったり、履歴を乱雑にしたくないものであれば、そもそも履歴に入らないようにするのが最善/最も早い方法です。$HISTCONTROLignorespace が含まれていることを確認してください

(bash)$ echo $HISTCONTROL
ignoredups:ignorespace

その後、履歴に不要なコマンドをスペースで処理します

(bash)$  sensitive-cmd-with --password 82cf7dfe
(bash)$  rm -r... # One-off recursive remove; mustn't be accidentally repeated!

誤って不要なコマンドを履歴に残してしまった場合、bash セッションがまだ開いていれば、そのコマンドはまだディスクに触れていません。履歴の中の前のコマンドを削除するには、次のようにしてください

(bash)$  history -d $((HISTCMD-1))

このコマンドは ignorespace を必要としますが、そうでなければ自分自身を削除してしまいます!

直近のコマンドを削除したい場合は、最後と最初の履歴の番号を探します

(bash)$  history 5
598  ok
599  sensitive
600  unsafe
601  doesn\'t-work
602  otherwise-unwanted

この場合、602と599。それから発行します

(bash)$  for i in {602..599}; do history -d $i; done

(ignorespaceがなければ603…599となる)

現在のセッションの履歴をディスクに残したくない場合は、次のようにして終了してください

(bash)$ kill -9 $$

これまでのアプローチは、理論的には不揮発性メディアから削除されたデータはまだ回復することができるので、余分なセキュリティのために、機密履歴項目をディスクに書き込むことさえさせないことです

しかし、削除したいコマンドが前のセッションのものである場合、終了時にはすでに$HISTFILEに追加されています。上記のコマンドで履歴を操作しても、終了時に$HISTFILEに新しい項目が追加されるだけです。$HISTFILEを現在のセッションの履歴全体のビューで上書きするには、$HISTFILEを実行してください

(bash)$  history -w

もちろん、すでにディスク上にある履歴項目については、history -dコマンドで履歴を編集してからhistory -wを発行する代わりに、テキストエディタで$HISTFILEを編集することができます

34  James Haigh  2013-06-18


Several techniques:

履歴ファイルに機密情報が保存されないようにします

あなたがコマンドラインでいくつかのパスワードを入力した場合、その後、すべてのコマンドがログに記録されていることを実現するには、どちらかの可能性があります

  1. 履歴を保存せずに現在のセッションを強制終了します

     kill -9 $$
    

    これにより、現在の履歴がすべて削除されます

  2. 開いている bash セッションで機密情報が表示されるまで ↑ (up arrow) と入力し、Ctrl+W のような行編集キーを使って機密情報を削除し、↓ (down arrow) のように新しい空行が表示されるまで Enter と入力してください

履歴ファイルから機密情報を削除します

機密情報がすでに保存されていることに気付いて、削除したくても履歴が全部残っているわけではないことに気付いた場合

単純な sed コマンドで十分です

sed -e '/SeNsItIvE InFo/d' -i .bash_history

しかし これを入力すると 削除しようとしている検索パターン(機密情報)を含む 別の履歴行を作成してしまいますだから、あなたはできるのです

sed -e "/$(head -n1)/d" -i .bash_history

これはターミナルからの入力でhead -n1を実行します。ターミナルがハングしているように表示されます (プロンプトは出ません)。これは、コマンドラインに実際に入力しなくてもコマンドを入力できるようにするためのトリックです。そして、sedはあなたが入力したテキストを使って.bash_historyを検索し、機密情報を含む全ての行を削除します。注意: 機密情報パターンにスラッシュが含まれている場合は、それらをバックスラッシュでエスケープしなければなりません

sed -e "\|$(head -n1)|d" -i .bash_history

もう一つの方法は、機密情報だけを削除することができますが、情報を含むコマンドを保持します。このためには、単にあなたが選択した代替テキストで機密情報を置き換えることができます

sed -e "s/$(head -n1)/Santa Claus/g" -i .bash_history.

特定のツリー内の任意のファイルから機密情報を削除します

最後に、これが別の忘れられたファイルに残らないようにするために

SENSITIVEINFO="$(head -n1)"
find . -type f -print0 | xargs -0 grep -l "$SENSITIVEINFO"

をクリックすると、該当するすべてのファイルが一覧表示されます

find . -type f -print0 |
xargs -0 grep -l "$SENSITIVEINFO" |
tr \\n \\0 |
xargs -0 sed -e "s/$SENSITIVEINFO/Santa Claus/g" -i

は、. を基点とするディレクトリツリー内の全てのファイルに存在する機密情報を全て置換します。注意: このコマンドは xargs -0 を使用していますが、名前に改行があるファイルは扱いません

17  F. Hauri  2013-07-19


削除したい行が表示されるまで↑ (up arrow)を押して、削除したい行を探し、Ctrl+Uを押してください。これで行が削除されます

historyコマンドを使うと、その行がアスタリスクで置換されているのがわかります

12  vicentecarro  2015-04-01


複数の行を同時に削除する必要がある場合は、私は通常これを使用しています

history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'

最後のコマンドを削除する必要がある場合は、使用することができます

history -d $((HISTCMD-2))

5  Bond  2013-01-07


履歴から行の範囲を削除する必要がある場合は、以下の bash 関数を使用すると時間を節約できます

function histdel() {
[ $# -eq 1 ] && history -d "$1" && history -w
if [ $# -eq 2 -a "$1" -le "$2" ]; then
for n in `seq "$2" "$1"`; do
history -d "$n"
done
history -w
fi
}

この関数は通常 $HOME/.bashrc に追加されるべきです。この関数をすぐに使うためには、実行中のシェルにファイルを読み込ませる必要があります (. $HOME/.bashrc)。その後、例えば200〜210のコマンドを履歴から削除することができます

$ histdel 200 210

(注: この質問は、bashの履歴から範囲のコマンドを削除することを検索すると、検索結果の上位に入ってきます。そのため、上記は質問の内容以上ではありますが、一部の読者にとっては参考になるかもしれません)

4  m000  2012-10-26


history | sed -i 59d

59が行番号です。これ以上に甘いものはありません。)

3  KroKite  2013-04-03


これらを試してみてください

$ history

これは履歴とコマンドのIDを表示します

. . 211 ls 212 javac Welcome.java 213 java welcome

use,

$ history -d 211

ここで211は履歴のIDです。これを使って確認してみましょう

$ history

. . 211 javac Welcome.java 212 java welcome

3  user3378188  2014-03-04


久しぶりの質問で長くなってしまいましたが、私の履歴ファイルの掃除とログアウトを同時に行う方法をご紹介します

私は実行します。history -w && nano "${HISTFILE}" && history -c && exit

何をするかは簡単です

  1. history -w : "${HISTFILE}"の中にキャッシュされた履歴を書き込む
  2. nano "${HISTFILE}" : "${HISTFILE}" の編集を許可してください
  3. history -c : キャッシュされた履歴をクリアするので、この最後のコマンドは追加されません
  4. exit : キャッシュされた履歴の追加をログアウトしてください。)

このコマンドを実行すると、きれいな履歴ファイルでログアウトされます。ログインして履歴を確認してください 😉

誰かのお役に立てれば幸いです

2  ncenerar  2015-09-30


また、履歴ファイルを直接編集することもできます

1  Ducky  2017-03-27


タイトルとURLをコピーしました