2012-01-31 15:43:03 +0000 2012-01-31 15:43:03 +0000
152
152
Advertisement

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

Advertisement

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

Advertisement
Advertisement

回答 (12)

152
152
152
2012-01-31 16:09:25 +0000

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

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

この2つのステップにより、メモリ内のhistory.bashhistory_ファイルから永久に行が削除されます。

118
118
118
2012-01-31 16:01:05 +0000

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

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

41
Advertisement
41
41
2012-02-01 22:19:06 +0000
Advertisement

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

$ export HISTCONTROL=ignorespace

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

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

0x1& を実行することで、履歴を完全にクリアすることができます。

33
33
33
2013-06-18 16:33:19 +0000

まず第一に、これから発行しようとしているコマンドが機密性の高いものであったり、安全でないものであったり、履歴を汚したくないものであれば、そもそも履歴に入らないようにするのが一番の近道です。$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 


_(`ignorespace`がなければ603..599になります)_ 


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

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

これまでのアプローチでは、セキュリティを高めるために、機密性の高い履歴項目をディスクに書き込まないようにしていましたが、理論的には不揮発性メディアから削除されたデータはまだ復元できるからです。

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

(bash)$ kill -9 $$

もちろん、既にディスク上にあるヒストリアイテムについては、history -dコマンドでヒストリを編集してからhistory -wを実行する方法の代わりに、テキストエディタで$HISTFILEを編集することができます。t-work 602 otherwise-unwanted ”`

(0x6&がなければ603..599になります)

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

(bash)$ history -w

これまでのアプローチでは、セキュリティを高めるために、機密性の高い履歴項目をディスクに書き込まないようにしていましたが、理論的には不揮発性メディアから削除されたデータはまだ復元できるからです。

しかし、削除したいコマンドが以前のセッションのものである場合、終了時にはすでに 0x6& に追加されています。上記のコマンドで履歴を操作しても、残りの新しい項目は終了時に0x6&に追加されるだけです。0x6&を現在のセッションの全体ヒストリのビューで今すぐ上書きするには、次のように実行してください:

0x1&

もちろん、既にディスク上にあるヒストリアイテムについては、0x6&コマンドでヒストリを編集してから0x6&を実行する方法の代わりに、テキストエディタで0x6&を編集することができます。

17
Advertisement
17
17
2013-07-19 12:50:40 +0000
Advertisement

いくつかのテクニック。

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

コマンドラインでパスワードを入力した後、すべてのコマンドがログに記録されていることに気付いた場合、以下のいずれかの方法が考えられます。

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

  1. 2. 開いている bash セッションで、機密情報が表示されるまで↑(上矢印)と入力し、Ctrl+Wなどの行編集キーを使って機密情報を削除し、その後 ↓(下矢印)と入力して、新しい空行が表示されるまで** Enterを入力する。

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

機密情報がすでに保存されていることに気付いていて、それを削除したいが、履歴全体は削除したくない場合。

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

しかし、このコマンドを入力すると、削除しようとしている検索パターン(機密情報)を含む別の履歴行が作成されます。そのため、以下のようになります。

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

これはターミナルからの入力で sed を実行します。ターミナルがハングアップしているように表示されます(プロンプトは出ません)ので、ファイルから削除したい情報を入力してください。これは、コマンドラインに実際に入力しなくてもコマンドを入力できるようにするためのトリックです。そうすると、head -n1 は入力したテキストを使って 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

は、.bash_history でルート化されたディレクトリツリー内の全てのファイルに存在する機密情報を全て置き換えます。注意: このコマンドは sed を使用しますが、名前に改行があるファイルは扱いません。

12
12
12
2015-04-01 16:00:26 +0000

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

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

5
Advertisement
5
5
2013-01-07 05:53:04 +0000
Advertisement

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

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

最後のコマンドを削除する必要がある場合は、次のようにします。

history -d $((HISTCMD-2))
3
3
3
2012-10-26 14:09:51 +0000

履歴から一連の行を削除する必要がある場合、以下の 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 の履歴から一連のコマンドを削除することを検索すると、検索結果の上位に表示されます。そのため、上記は質問の内容以上ではありますが、一部の読者にとっては参考になるかもしれません)

3
Advertisement
3
3
2014-03-04 11:16:04 +0000
Advertisement
$ history

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

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

.

use,

$ history -d 211

ここで211は履歴のIDです。

$ history

. . 211 javac Welcome.java 212 java welcome . .

3
3
3
2013-04-03 21:16:15 +0000
history | sed -i 59d

59が行番号です。これ以上に甘いものはないでしょう :)

2
2
2
2015-09-30 04:57:29 +0000

この質問が出てきてから随分時間が経ってしまいましたが、履歴ファイルのクリーンアップとログアウトを同時に行う私の方法を紹介します。

私は :history -w && nano "${HISTFILE}" && history -c && exit

を実行しています。history -w 1. "${HISTFILE}" 2. nano "${HISTFILE}" : "${HISTFILE}" 1. "${HISTFILE}" 2. history -c 3. exit : キャッシュされた履歴をクリアするので、この最後のコマンドは追加されません。 4. 0x6& : キャッシュされた履歴を追加してログアウトします。)

このコマンドを実行すると、履歴ファイルがきれいになった状態でログアウトされます。ログインして履歴を確認する ;)

これが誰かの参考になれば幸いです。

1
1
1
2017-03-27 14:10:10 +0000

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

Advertisement

関連する質問

6
10
11
5
14
Advertisement
Advertisement