Bash履歴ファイルから特定の行を削除します


回答:


108

history -a現在の履歴をディスクにコミットするには、ログアウトしてから再度実行するか、実行する必要があります。

次に、ファイルを編集します~/.bash_history


19
HISTFILE環境変数が設定されている場合、履歴ファイルは〜/ .bash_historyではなく、$ {HISTFILE}です。
カロロス

20
シェルを終了すると、エントリが履歴ファイルに書き込まれます。したがって、削除するコマンドを入力したら、ログアウトしてから再度ログインするか、「history -d xxxx」を使用して現在のシェルセッションから削除する必要があります。
害14年

3
しかし、どのように履歴ファイルを編集した記録を削除しますか?
chiliNUT 14

5
@chiliNUT:vim ~/.bash_historyスペース(たとえば)でコマンドを開始します。通常、スペースで始まるコマンドはログに記録されません(を参照$HISTCONTROL)。
cYrus 14

私のディストリビューションではそうは思いませんが、一般的には理にかなっています
chiliNUT 14

149

次の2つの手順でコマンドラインを使用して、履歴ファイルから削除できます。

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

2つのステップを合わせて、メモリ内の履歴.bash_historyファイルからも行を永久に削除します。


7
history -w履歴から最後を削除する方法は?
KrIsHnA

@KrIsHnA〜/ .bash_historyを手動で編集
アレクサンダーミショフ

5
それが追加されるのを防ぐために、前または@ TAOの答えのように、スペースを追加
マーク・

検索するには<line_number>ちょうどhistory | grep [unwanted_content]含むすべての行でリストを取得するには[unwanted_content](パスワードなど)。
AvL

複数の(特定の)行を(IDで)どのように削除しますか?
パトロス

39

するために予防そもそも履歴に追加されてからのコマンドを、環境変数があることを確認してHISTCONTROLそのコロンで区切られた値のうち、値が含まれているignorespace例を、(例えばを追加.bashrc):

$ export HISTCONTROL=ignorespace

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

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

32

まず、発行しようとしているコマンドが機密性が高く、安全でない場合、または履歴を乱雑にする必要がない場合、最初から履歴に入力しないようにするのが最善/迅速です。以下が$HISTCONTROL含まれていることを確認してくださいignorespace

(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

(bash)$  history -w

もちろん、すでにディスク上にある履歴項目の場合、history -dコマンドを使用して履歴history -wを編集し$HISTFILEてから発行する代わりに、テキストエディターで編集します。


1
「上記のコマンドで履歴を操作しても、終了時に残りの新しいアイテムが追加されるだけです。」実際には、これは正確には正しくありません。元の履歴の長さから「突き出ている」残りの新しいアイテムのみを追加するようです。たとえば、5つの元のアイテムを削除し、15個の新しいアイテムを追加すると、最後の10個だけが追加されますが、15個すべての新しいアイテムが追加されると予想されます。これがどのように望ましい機能であるかを見ることができないので、これはバグだと思います。$HISTFILE
ジェームズヘイ

1
bashは元の長さに注意していると思います。セッション終了時に、おそらくこの値よりも大きい番号のアイテムを追加します。数値がこの値以下のアイテムが削除されるたびにこの値が減らされた場合、期待どおりに機能します。;-)
ジェームズヘイ

15

いくつかのテクニック:

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

コマンドラインでパスワードを入力した場合、すべてのコマンドがログに記録されることを認識して、次のいずれかを実行できます。

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

     kill -9 $$

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

  2. タイプ↑ (up arrow)の機密情報までオープンbashのセッションでは、その後のような行編集キーストロークを使用して、示されている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するか、この構文を使用してパターンに表示されない区切り文字を指定するようにコマンドを変更する必要があります。

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ますが、名前に改行を含むファイルは処理しません。


11

表示さ↑ (up arrow)れるまでを押して削除する行を見つけ、Ctrl+ を押しUます。これで行が削除されます。

このhistoryコマンドを使用すると、行がアスタリスクに置き換えられていることがわかります。


2
実際には、行までカーソルを移動し、Ctrl + Uを押してから、別の行(リストの一番下にある空白)までカーソルを上下に移動する必要があると思います。また、厳密に言えば、この行はアスタリスクに置き換えられていません。むしろ、コマンドは消去され、履歴番号にが追加されてい*ます。
G-マン

1
これは、Ctrl + R(逆インクリメンタル履歴検索)を使用するとさらに強力になります。その後、[End]、Ctrl + U
sehe

4

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

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

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

history -d $((HISTCMD-2))

2
これは、それが働いたように見えたけどhistory | grep <string>、まだ...それは削除するように主張し、すべての行を表示
Brockさんヘンズリーを

1
これは、fisrtを削除した後に間違った履歴行を削除します!!
mivk

1
しかし、幸いなことに、間違った削除コマンドのみが出力されます。以下は、正しい削除コマンドを印刷します:history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
mivk

3

履歴から一連の行を削除する必要がある場合、次の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。関数imediatellyを使用するには、実行中のシェル(. $HOME/.bashrc)でファイルを再度読み取る必要があります。次に、たとえばコマンド200-210を履歴から削除するには:

$ histdel 200 210

(注:この質問は、bash履歴から一連のコマンドを削除することを検索する場合の上位の検索結果の1つです。したがって、上記の質問は質問の内容以上ですが、一部の読者にとっては便利です。)


3
以下のための代替形式forのステートメントは:for n in $(seq "$2" "$1")文体場合、いくつかに好まれており、seq動作しません、してみてくださいfor ((n="$2"; n>="$1"; n--))
スコット


3

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

$ history

これにより、履歴のIDとコマンドが表示されます。たとえば、



211 ls
212 javac Welcome.java
213 java welcome

つかいます、

$ history -d 211

ここで211は履歴のIDです。これを使用してこれを確認してください

$ history



211 javac Welcome.java
212 java welcome


2

この質問に答えてから長い時間が経ったことはわかっていますが、履歴ファイルのクリーニングとログアウトを同時に行う方法を紹介します。

走る : history -w && nano "${HISTFILE}" && history -c && exit

それがすることは簡単です:

  1. history -w :キャッシュされた履歴を内部に書き込みます "${HISTFILE}"
  2. nano "${HISTFILE}":編集を許可します"${HISTFILE}"sedスクリプトなどを使用して、クリーンにすることができます"${HISTFILE}"
  3. history -c :キャッシュされた履歴を消去して、この最後のコマンドが追加されないようにします。
  4. exit :キャッシュされた履歴を追加してログアウトしますが、空です;)

そのコマンドの後、クリーンな履歴ファイルでログアウトされます。ログインして履歴を確認してください;)

これが誰かの助けになることを願っています。


1

またnano .bash_history、bashシェルを使用している場合など、履歴ファイルを直接編集することもできますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.