web-dev-qa-db-ja.com

特定のシェルでbash_historyを一時的に中断しますか?

ある種の「シークレット」モードに入るように、bashで履歴の追跡を一時的に停止する方法はありますか?記録された機密の財務情報を必要としないものを端末に入力しています。

128
Naftuli Kay

これはあなたが探しているものでなければなりません:

unset HISTFILE

man bashから

HISTFILEが設定されていない場合、または履歴ファイルが書き込み不可の場合、履歴は保存されません。

あるいは、オフに切り替えてから再びオンにしたい場合は、 set を使用する方が簡単な場合があります。

消す

set +o history

オンにする

set -o history
173
SiegeX

Bashを使用して、HISTCONTROL="ignorespace"と、履歴に記録したくないコマンドの前にスペースを付けます。対策を忘れてしまった場合のために、history -d <number>特定のエントリを削除する場合、またはhistory -cコマンド履歴全体をクリアします。

33
forcefsck

HISTCONTROLignorespaceが含まれていることを確認してください。おそらくHISTCONTROL=ignorespace(またはHISTCONTROL=ignoredups:ignorespaceまたは何か)をあなたの~/.bashrc。その後、スペースで始まるコマンドラインは履歴から削除されます。

別の可能性は、履歴を保存しない新しいbashセッションを開始することです。

$ bash
$ unset HISTFILE
$ sooper-sekret-command
$ exit
$ #back in the parent Shell

複数のコマンドを保存する必要がなく、上矢印を使用して前のコマンドにアクセスする場合は、次のコマンドを使用します。

$ bash                        # open a new session.
$ unset HISTFILE              # avoid recording commands to file.
$ commands not recorded
.
.
$ exit
$

コマンドの格納方法を制御するには、4つの方法(レベル)があります。

  1. 最初の最も簡単な方法は、ignorespace(またはignoreboth)を使用することです。

    $ HISTCONTROL="ignorespace${HISTCONTROL:+:$HISTCONTROL}"
    

    これにより、historyのメモリリストに記録されないようにするコマンドの前にスペースを使用できます。また、結果として、ファイルに送信できるコマンドがメモリに記録されていないため、_oneコマンドが$HISFILEにリストされているファイルに送信されることも回避されます。

  2. コマンドを$HISTFILEのファイルに記録しないでください:

    $ unset HISTFILE
    

    設定しない場合、シェルの終了時にコマンド履歴は保存されません。

    Null HISTFILE=''および/またはHISTFILE=/dev/nullに設定すると、同じ効果が得られます。コマンドがまだメモリリストに記録されていることを理解し、historyコマンドまたは上矢印を試してください。

    警告:シェルが存在する前にHISTFILEがリセットされると、メモリに記録されているすべてのものがファイルに書き込まれる可能性があります。

  3. newコマンドをメモリの履歴リストに記録しないでください。また、メモリにないため、ファイルに記録できません。

    $ shopt -ou history              # or set +o history
    

    shopt -os history(またはset -o history)で再度有効にする

  4. メモリ内の履歴リストからすべてのコマンドを削除します。

    $ HISTSIZE=0
    

    すべてのコマンドは(メモリから)消去されるため、変数が有効な数値に再度設定されるまで、ファイルには何も保存できません。

6
Isaac

履歴をオフにする簡単な方法が1つあるため、コマンドは.bash_historyファイルに保存されません。

コマンドが履歴に保存されないように、コマンドの前に空白またはタブスペースを配置する必要があります。例えば:

$ ls 
print the list of file 
$ history 
ls
history

$  pwd
print the current  working directory 
$ history 
ls
history

pwdコマンドは前に空白があるため、履歴に保存されません。

3
Kalanidhi M.
export HISTFILE=/dev/null 

それが私の後藤のやり方です。未設定のHISTORY/HISTFILE/HISTCONTROLなどが機能しない場合に備えて、/ dev/nullへのエクスポートは常に機能していました。

2
Ambrose

SiegeXの回答をもう少し進めて、これをシークレットモードにするには...

免責事項:タイトル関連のものはおそらくgnome-terminalで動作するでしょう。 Linux Mint 19.3/Gnome Terminal 3.28.1でのみテストされました。私は怠惰だからです。

以下を~/.bash_functionsに追加します(これは.bashrc/.profileなどを介してインポートすることを前提としています):

function setGnomeTerminalTitle() {
    local NEW_TITLE="$1";
    PS1="\[\e]0;${NEW_TITLE}\a\]\${debian_chroot:+(\$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\] \[\033[01;34m\]\w \$\[\033[00m\]";
}

次に、以下を~/.bash_aliasesに追加します(これも、.bashrc/.profileなどを介してインポートすることを前提としています)。

alias title="setGnomeTerminalTitle";
alias hist='history'
alias histoff="setGnomeTerminalTitle 'Incognito Window' && set +o history"
alias histon="setGnomeTerminalTitle \"$USER@$HOSTNAME:\${PWD//\${HOME//\\//\\\\\\/}/\\~}\" && set -o history"

編集:ヒストンのタイトルに関する説明-通常、gnome-terminalのウィンドウタイトルは「$ USER @ $ HOSTNAME:$ {PWD}」ですが、ホームフォルダー/ home/fooにいる場合は、~として表示されます。 ;少なくともそれは私のコンピュータ上にあります。このコマンドは、bash文字列置換を使用して$HOMEのスラッシュをエスケープするため、\/home\/fooを取得し、次にそれを正規表現として使用して、$PWDのパターンをリテラル~ ...に置き換え、次にエスケープの束を上に追加します二重引用符で囲まれた文字列のエイリアスとして機能させる。

これで、histoffと入力すると、シークレットモードのタイトルが変更され、そのウィンドウでのセッションの履歴が停止します(Wordのhistoffは引き続きログに記録されますが、その後は何も記録されません)。次にhistonと入力すると、タイトルが元に戻され、histoffからhistonまでのすべての行が記録されますが、histon以降のすべての行が記録されます。

例:

## this is still logged
histoff  

## this is NOT logged
echo "my password is: password";
fake_ua='If firefox and curl had a child, would it be named furl?';
curl -A "$fake_ua" https://www.itsnotap0rnsiteipromise.com/curvy-girlz/;

vi ~/Documents/maths/super-secret-squirrel/gift-ideas.txt

## this is still NOT logged
histon

## this is logged again
Sudo apt install -y kmag;

0
zpangwin