回答:
history -a
現在の履歴をディスクにコミットするには、ログアウトしてから再度実行するか、実行する必要があります。
次に、ファイルを編集します~/.bash_history
。
vim ~/.bash_history
スペース(たとえば)でコマンドを開始します。通常、スペースで始まるコマンドはログに記録されません(を参照$HISTCONTROL
)。
次の2つの手順でコマンドラインを使用して、履歴ファイルから削除できます。
history -d <line_number>
すると、指定した行がメモリ内の履歴から削除されます。history -w
と、現在のメモリ内履歴が~/.bash_history
ファイルに書き込まれます。2つのステップを合わせて、メモリ内の履歴と.bash_historyファイルからも行を永久に削除します。
history -w
履歴から最後を削除する方法は?
<line_number>
ちょうどhistory | grep [unwanted_content]
含むすべての行でリストを取得するには[unwanted_content]
(パスワードなど)。
まず、発行しようとしているコマンドが機密性が高く、安全でない場合、または履歴を乱雑にする必要がない場合、最初から履歴に入力しないようにするのが最善/迅速です。以下が$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
(bash)$ history -w
もちろん、すでにディスク上にある履歴項目の場合、history -d
コマンドを使用して履歴history -w
を編集し$HISTFILE
てから発行する代わりに、テキストエディターで編集します。
$HISTFILE
いくつかのテクニック:
コマンドラインでパスワードを入力した場合、すべてのコマンドがログに記録されることを認識して、次のいずれかを実行できます。
履歴を保存せずに現在のセッションを強制終了します。
kill -9 $$
これにより、現在のすべての履歴が削除されます。
タイプ↑ (up arrow)の機密情報までオープンbashのセッションでは、その後のような行編集キーストロークを使用して、示されている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
するか、この構文を使用してパターンに表示されない区切り文字を指定するようにコマンドを変更する必要があります。
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 | grep <string>
、まだ...それは削除するように主張し、すべての行を表示
history | grep XYZ | grep -v grep | tac | awk '{print "history -d", $1}'
履歴から一連の行を削除する必要がある場合、次の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を使用するには、実行中のシェル(. $HOME/.bashrc
)でファイルを再度読み取る必要があります。次に、たとえばコマンド200-210を履歴から削除するには:
$ histdel 200 210
(注:この質問は、bash履歴から一連のコマンドを削除することを検索する場合の上位の検索結果の1つです。したがって、上記の質問は質問の内容以上ですが、一部の読者にとっては便利です。)
for
のステートメントは:for n in $(seq "$2" "$1")
文体場合、いくつかに好まれており、seq
動作しません、してみてくださいfor ((n="$2"; n>="$1"; n--))
。
これらを試してみてください
$ history
これにより、履歴のIDとコマンドが表示されます。たとえば、
。
。
211 ls
212 javac Welcome.java
213 java welcome
。
。
つかいます、
$ history -d 211
ここで211は履歴のIDです。これを使用してこれを確認してください
$ history
。
。
211 javac Welcome.java
212 java welcome
。
。
この質問に答えてから長い時間が経ったことはわかっていますが、履歴ファイルのクリーニングとログアウトを同時に行う方法を紹介します。
走る :
history -w && nano "${HISTFILE}" && history -c && exit
それがすることは簡単です:
history -w
:キャッシュされた履歴を内部に書き込みます "${HISTFILE}"
nano "${HISTFILE}"
:編集を許可します"${HISTFILE}"
sedスクリプトなどを使用して、クリーンにすることができます"${HISTFILE}"
history -c
:キャッシュされた履歴を消去して、この最後のコマンドが追加されないようにします。exit
:キャッシュされた履歴を追加してログアウトしますが、空です;)そのコマンドの後、クリーンな履歴ファイルでログアウトされます。ログインして履歴を確認してください;)
これが誰かの助けになることを願っています。