history
のデータベースから特定の行を削除するには?
159 None 2012-01-31
現在の履歴がディスクにコミットされるように、ログアウトしてバックインするか、history -a
を実行する必要があります
あとはファイル~/.bash_history
を編集するだけです
124 cYrus 2012-01-31
コマンドラインを使用して、2つのステップで履歴ファイルからの削除を実現することができます
history -d <line_number>
と入力すると、メモリ上の履歴から指定した行を削除する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
まず第一に、これから発行しようとしているコマンドが機密性の高いものであったり、安全でないものであったり、履歴を乱雑にしたくないものであれば、そもそも履歴に入らないようにするのが最善/最も早い方法です。$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
を現在のセッションの履歴全体のビューで上書きするには、$HISTFILE
を実行してください
(bash)$ history -w
もちろん、すでにディスク上にある履歴項目については、history -d
コマンドで履歴を編集してからhistory -w
を発行する代わりに、テキストエディタで$HISTFILE
を編集することができます
34 James Haigh 2013-06-18
Several techniques:
履歴ファイルに機密情報が保存されないようにします
あなたがコマンドラインでいくつかのパスワードを入力した場合、その後、すべてのコマンドがログに記録されていることを実現するには、どちらかの可能性があります
履歴を保存せずに現在のセッションを強制終了します
kill -9 $$
これにより、現在の履歴がすべて削除されます
開いている 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
何をするかは簡単です
history -w
:"${HISTFILE}"
の中にキャッシュされた履歴を書き込むnano "${HISTFILE}"
:"${HISTFILE}"
の編集を許可してくださいhistory -c
: キャッシュされた履歴をクリアするので、この最後のコマンドは追加されませんexit
: キャッシュされた履歴の追加をログアウトしてください。)
このコマンドを実行すると、きれいな履歴ファイルでログアウトされます。ログインして履歴を確認してください 😉
誰かのお役に立てれば幸いです
2 ncenerar 2015-09-30
また、履歴ファイルを直接編集することもできます
1 Ducky 2017-03-27