history
のデータベースから特定の行を削除するにはどうすればいいですか?
ログアウトして再度ログインするか、history -a
を実行して現在の履歴をディスクに保存する必要があります。
それからファイル~/.bash_history
を編集してください。
2つのステップでコマンドラインを使用して履歴ファイルから削除することができます。
history -d <line_number>
を入力すると、メモリ内の履歴から指定された行が削除されます。history -w
と入力すると、現在のメモリ内履歴が~/.bash_history
ファイルに書き込まれます。この2つの手順で、メモリ内の履歴の履歴と。bash_historyファイルからも行が完全に削除されます。
aコマンドが最初から履歴に追加されないようにするには、環境変数HISTCONTROL
にコロンで区切られた値の中に値ignorespace
が含まれていることを確認します(例:.bashrc
に追加)。
$ export HISTCONTROL=ignorespace
これにより、先頭にスペースがあるコマンドが履歴に追加されなくなります。実行すると履歴を完全に消去できます。
$ history -c -w
^-- additional space character
まず、発行しようとしているコマンドが機密性が高く、安全でない場合、または履歴を乱雑にする必要がない場合、最初から履歴に入力しないようにすることをお勧めします。 $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になります。)
any現在のセッションの履歴がディスクにヒットしないようにするには、次を使用して終了します。
(bash)$ kill -9 $$
理論的には、不揮発性メディアから削除されたデータはまだ回復できるため、これまでのアプローチでは、機密性の高い履歴アイテムをディスクに書き込ませずにセキュリティを強化します。
ただし、削除するコマンドが前のセッションからのものである場合、終了時に$HISTFILE
に既に追加されています。上記のコマンドで履歴を操作しても、まだappend残りのnewが$HISTFILE
に項目、終了時になります。 上書き$HISTFILE
を全体履歴の現在のセッションのビューで、現在を発行:
(bash)$ history -w
もちろん、すでにディスク上にある履歴項目の場合、history -d
コマンドで履歴を編集してからhistory -w
を発行する代わりに、テキストエディターで$HISTFILE
を編集することもできます。
いくつかのテクニック:
コマンドラインでパスワードを入力した場合は、すべてのコマンドがログに記録されていることがわかります。
履歴を保存せずに現在のセッションを強制終了します。
kill -9 $$
これは現在の履歴をすべて削除します。
タイプ ↑ (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
が使用されていても、名前に改行が含まれているファイルは処理されません。
を押して、削除したい行を見つけます。 ↑ (up arrow) 表示されるまで押してから、を押します。 Ctrl+U。それは行を削除する必要があります。
history
コマンドを使用すると、行がアスタリスクに置き換えられているのがわかります。
あなたが同時にいくつかの行を削除する必要があるなら、私は通常これを使います:
history | grep <string> | cut -d ' ' -f 3 | awk '{print "history -d " $1}'
最後のコマンドを削除する必要がある場合は、次のものを使用できます。
history -d $((HISTCMD-2))
history | sed -i 59d
59は行番号です。これ以上甘いものにすることはできません:)
これらを試してください
$ history
これにより、履歴のIDとコマンドが表示されます。
。
.
211 ls
212 javac Welcome.Java
213 Javaへようこそ
.
.
つかいます、
$ history -d 211
ここで211は歴史のIDです。今これを使用してこれを確認してください
$ history
。
.
211 javac Welcome.Java
212 Javaへようこそ
.
.
履歴から一定範囲の行を削除する必要がある場合は、次の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つです。したがって、上記の質問は質問以上のものですが、一部の読者には役立つ場合があります。
この質問に答えてから長い時間が経ったことはわかっていますが、履歴ファイルのクリーニングとログアウトを同時に行う方法を紹介します。
実行:history -w && nano "${HISTFILE}" && history -c && exit
それがすることは簡単です:
history -w
:"${HISTFILE}"
内にキャッシュされた履歴を書き込みますnano "${HISTFILE}"
:"${HISTFILE}"
の編集を許可しますsedスクリプトを使用するか、"${HISTFILE}"
をきれいにしたいものを使用できますhistory -c
:キャッシュされた履歴を消去して、この最後のコマンドが追加されないようにします。exit
:キャッシュされた履歴を追加してログアウトします...しかし、空です;)そのコマンドの後、クリーンな履歴ファイルでログアウトされます。ログインして履歴を確認してください;)
これが誰かの助けになることを願っています。