web-dev-qa-db-ja.com

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

historyのデータベースから特定の行を削除するにはどうすればいいですか?

140
w0rldart

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

それからファイル~/.bash_historyを編集してください。

105
cYrus

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

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

この2つの手順で、メモリ内の履歴の履歴。bash_historyファイルからも行が完全に削除されます。

145
Paperlantern

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

$ export HISTCONTROL=ignorespace

これにより、先頭にスペースがあるコマンドが履歴に追加されなくなります。実行すると履歴を完全に消去できます。

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

まず、発行しようとしているコマンドが機密性が高く、安全でない場合、または履歴を乱雑にする必要がない場合、最初から履歴に入力しないようにすることをお勧めします。 $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になります。)

any現在のセッションの履歴がディスクにヒットしないようにするには、次を使用して終了します。

(bash)$ kill -9 $$

理論的には、不揮発性メディアから削除されたデータはまだ回復できるため、これまでのアプローチでは、機密性の高い履歴アイテムをディスクに書き込ませずにセキュリティを強化します。

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

(bash)$  history -w

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

32
James Haigh

いくつかのテクニック:

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

コマンドラインでパスワードを入力した場合は、すべてのコマンドがログに記録されていることがわかります。

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

     kill -9 $$
    

    これは現在の履歴をすべて削除します。

  2. タイプ ↑ (up arrow) 機密情報が表示されるまで、オープンbashセッションでは、次のような行編集キーストロークを使用します。 Ctrl+W 機密情報を削除し、その後 ↓ (down arrow) 新しい空行が表示されるまで、beforeタイピング 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が使用されていても、名前に改行が含まれているファイルは処理されません。

14
F. Hauri

を押して、削除したい行を見つけます。 ↑ (up arrow) 表示されるまで押してから、を押します。 Ctrl+U。それは行を削除する必要があります。

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

11
vicentecarro

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

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

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

history -d $((HISTCMD-2))
4
Bond
history | sed -i 59d

59は行番号です。これ以上甘いものにすることはできません:)

3
KroKite

これらを試してください

$ history

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


.
211 ls
212 javac Welcome.Java
213 Javaへようこそ
.
.

つかいます、

$ history -d 211

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

$ history


.
211 javac Welcome.Java
212 Javaへようこそ
.
.

3
user3378188

履歴から一定範囲の行を削除する必要がある場合は、次の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関数を使うためには、あなたの走っているShell(. $HOME/.bashrc)によってファイルが再び読まれる必要があるでしょう。その後削除します。履歴から200から210までのコマンド:

$ histdel 200 210

(注:この質問は、bash履歴からコマンドの範囲を削除するための検索を行う場合の上位の検索結果の1つです。したがって、上記の質問は質問以上のものですが、一部の読者には役立つ場合があります。

3
m000

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

実行:history -w && nano "${HISTFILE}" && history -c && exit

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

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

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

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

2
ncenerar