web-dev-qa-db-ja.com

bash履歴で「history -d」を非表示にします

誤ってパスワードまたはbashで機密性の高いものを入力した場合、history -d ROW#を使用してその行を簡単に削除できますが、履歴にhistory -d ROW#コマンドが常に残され、誰かが間違いを修正したことを示します。

コマンドに何かを追加して、bash履歴に表示されないようにできますか?

14
Kalle Ling

履歴に単一のコマンドを保存しないようにするには、その前にスペースを置きます(ここででマークされています):

$ echo test
test
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2
$ echo test2
test2
$ history | tail -n2
 3431  echo test
 3432  history | tail -n2

この動作は~/.bashrcファイル、つまり次の行で設定されます。

HISTCONTROL=ignoreboth

man bash 言います:

ヒストコントロール
コマンドを履歴リストに保存する方法を制御する値のコロン区切りリスト。値のリストにignorespaceが含まれる場合、スペース文字で始まる行は履歴リストに保存されませんignoredupsの値は、前の履歴エントリに一致する行を保存しません。 ignorebothの値は、ignorespaceおよびignoredups

ちなみに、ignoredupsは、上記のテストでhistory | tail -n2が履歴に1回しか表示されない理由です。


端末の履歴はRAMに保存され、端末を閉じるとすぐに~/.bash_historyにフラッシュされます。 ~/.bash_historyから特定のエントリを削除する場合は、sedを使用して削除できます。

                                   # print every line…
sed '/^exit$/!d' .bash_history     # … which is just “exit”
sed '/^history/!d' .bash_history   # … beginning with “history”
sed '/>>log$/!d' .bash_history     # … ending with “>>log”
sed '\_/path/_!d' .bash_history    # … containing “/path/” anywhere

最後の1つでは、デフォルトの区切り文字/を検索用語内で使用されるため、_に変更しました。実際、これはsed -i '/\/path\//d' .bash_historyと同じです。コマンドが削除する行のみを出力する場合は、-iオプションを追加し、!ddに変更して削除を実行します。

                                   # delete every line…
sed -i '/^exit$/d' .bash_history   # … which is just “exit”
sed -i '/^history/d' .bash_history # … beginning with “history”
sed -i '/>>log$/d' .bash_history   # … ending with “>>log”
sed -i '\_/path/_d' .bash_history  # … containing “/path/” anywhere
28
dessert

1つの方法は、HISTIGNORE環境変数を設定することです。 man bashから

HISTIGNORE
      A colon-separated list of patterns used to decide which  command
      lines  should  be  saved  on  the history list.  Each pattern is
      anchored at the beginning of the line and must  match  the  com‐
      plete  line  (no  implicit  `*'  is  appended).  Each pattern is
      tested against the line after the checks specified  by  HISTCON‐
      TROL  are  applied. 

[FWIW、それはデフォルトのHISTCONTROLであり、前置き型の回避策を提供します]。

だから、例えば

HISTIGNORE='history -d*'

永続的にする場合は、~/.bashrcからエクスポートします

export HISTIGNORE='history -d*'
12
steeldriver

あなたはできる

  • 端末ウィンドウを閉じます。これにより、(他のウィンドウが閉じられた後)最後に閉じたターミナルウィンドウの最新の履歴がファイル/home/$USER/.bash_historyにフラッシュされます。

  • ファイル/home/$USER/.bash_historybashを使用せずに編集します。たとえば、 Alt+F2

    このようにして、履歴全体を検査し、もはやそこにいたくないコマンドを削除できます。

    enter image description here

    enter image description here

6
sudodus

私は通常使用します:

history -w; history -c; $EDITOR $HISTFILE; history -r

履歴ファイルはディスクに書き込まれ、メモリでクリアされます。編集して目的の操作を行い、編集した履歴ファイルが再び読み込まれます。

エディターがバックアップファイルを保存する場合、いたずらなWordがディスクに表示される可能性があることに注意してください。

-dを使用するもう1つのオプションは、予測履歴番号を使用することです。

startide sr> # good thing
startide sr> # bad thing
startide sr> history | tail -n 2
17239  # bad thing
17240  history | tail -n 2
startide sr> history -w; history -d 17239; history -d 17239; history -d 17239
startide sr> # other thing
startide sr> history | tail -n 3
17239  # good thing
17240  # other thing
17241  history | tail  -n 3

この例では、悪いものを削除し、履歴番号を取得するコマンドを削除してから、履歴の削除に使用したコマンドを削除します。その後、すべてが消毒されます。

1
Seth Robertson

履歴に保存せずにコマンドを実行する場合は、余分なスペースを追加してください

Prompt$ echo saved
Prompt$  echo not saved \
> #     ^ extra space

これが機能するには、HISTCONTROLでignorespaceまたはignorebothのいずれかが必要です。たとえば、実行

HISTCONTROL = ignorespaceこの設定を永続的にするには、.bashrcに設定します。

0
bkdroid13