履歴ファイルからの削除は、コマンドラインを使用して2つのステップで行うことができます。
1.history -d <line_number>
と入力すると、メモリ内の履歴から指定した行が削除されます。
2. history -w
と入力すると、現在のメモリ内の履歴が ~/.bash_history
ファイルに書き込まれる。
この2つのステップにより、メモリ内のhistoryと.bashhistory_ファイルから永久に行が削除されます。
そもそもコマンドが履歴に追加されないようにprepreventするには、環境変数 HISTCONTROL
がコロンで区切られた値の中に値 ignorespace
を含んでいることを確認してください、例えば (例: .bashrc
に追加)
$ export HISTCONTROL=ignorespace
これにより、先頭にスペースがあるコマンドが履歴に追加されるのを防ぐことができます。その後、
$ history -c -w
^-- additional space character
0x1& を実行することで、履歴を完全にクリアすることができます。
まず第一に、これから発行しようとしているコマンドが機密性の高いものであったり、安全でないものであったり、履歴を汚したくないものであれば、そもそも履歴に入らないようにするのが一番の近道です。$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
_(`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&を編集することができます。
いくつかのテクニック。
コマンドラインでパスワードを入力した後、すべてのコマンドがログに記録されていることに気付いた場合、以下のいずれかの方法が考えられます。
1.履歴を保存せずに現在のセッションを強制終了する。
機密情報がすでに保存されていることに気付いていて、それを削除したいが、履歴全体は削除したくない場合。
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
を使用しますが、名前に改行があるファイルは扱いません。
表示されるまで↑(上矢印)を押して削除したい行を探し、Ctrl+Uを押します。これで行が削除されます。
history
コマンドを使用すると、行がアスタリスクで置き換えられていることがわかります。
履歴から一連の行を削除する必要がある場合、以下の 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 の履歴から一連のコマンドを削除することを検索すると、検索結果の上位に表示されます。そのため、上記は質問の内容以上ではありますが、一部の読者にとっては参考になるかもしれません)
$ history
これらを試してみてください。
. 211 ls 212 javac Welcome.java 213 java welcome .
.
use,
$ history -d 211
ここで211は履歴のIDです。
$ history
. . 211 javac Welcome.java 212 java welcome . .
この質問が出てきてから随分時間が経ってしまいましたが、履歴ファイルのクリーンアップとログアウトを同時に行う私の方法を紹介します。
私は :history -w && nano "${HISTFILE}" && history -c && exit
を実行しています。history -w
1. "${HISTFILE}"
2. nano "${HISTFILE}"
: "${HISTFILE}"
1. "${HISTFILE}"
2. history -c
3. exit
: キャッシュされた履歴をクリアするので、この最後のコマンドは追加されません。
4. 0x6& : キャッシュされた履歴を追加してログアウトします。)
このコマンドを実行すると、履歴ファイルがきれいになった状態でログアウトされます。ログインして履歴を確認する ;)
これが誰かの参考になれば幸いです。