Bashでコマンド履歴を残さない方法

はじめに

BashでCLI上で秘密情報を環境変数として定義したいけど、履歴に残したくないという場面がよくあるので備忘録としてまとめておく。
検証する環境はWSL2(Ubuntu24.04 LTS)でbashを利用する。

環境

Windows 11 Professional
WSL2 Ubuntu 24.04 LTS

特定のコマンドだけ履歴に残さない

この方法は、あるコマンドだけ履歴に残したくない場合に、コマンドの前にスペースを入れることで実現ができる。

以下をコマンド入力前に設定しておく。

export HISTCONTROL=ignorespace

この設定が有効であれば、先頭にスペースを入れたコマンドは履歴に記録されない。

特定のコマンドを履歴に記録しない2

同様に、HISTIGNORE 変数を使うことで特定のコマンドを履歴に記録しないことが実現できる。
例えば、lscd のような頻繁に使うコマンドだけ履歴に残さない設定は次のようになる。

export HISTIGNORE="ls:cd"

これにより、指定されたコマンドは実行しても履歴に記録されなくなる。
:でコマンドを区切ることで、複数のコマンドを無視するように指定ができる。

セッション終了時に履歴を保存しない

Bashシェルは通常、~/.bash_history というファイルにコマンド履歴を保存する。
セッションが終了するたびに履歴を残さないようにするには、次のコマンドを実行して HISTFILE 変数を空にしておく。

unset HISTFILE

履歴の保存サイズを制限する

履歴に残すコマンドの数をゼロに設定することでも履歴を残さないようにできる。
これを設定するには、以下のように HISTSIZEHISTFILESIZE を設定する。

export HISTSIZE=0
export HISTFILESIZE=0

これにより、コマンド履歴の保存が完全に無効になる。
実行されたコマンドは即座に消去される。
このセッションのみとなるので、再ログインすると上記の設定は再度必要になる。

手動で履歴を削除する

途中で履歴をクリアしたい場合や、履歴を削除してからセッションを終了したい場合には、以下のコマンドを使う。

history -c

これにより、現在のセッション中の履歴がすべてクリアされる。
セッション終了時に自動的に履歴を削除したい場合は、~/.bash_logout ファイルに history -c を追加しておくとよい。

永続的に履歴を残さないようにする

履歴を完全に無効にしたい場合は、Bashの設定ファイル (~/.bashrc~/.bash_profile) に以下の設定を追加する。

export HISTFILE=/dev/null
export HISTSIZE=0
export HISTFILESIZE=0

これにより、セッション中もセッション終了後も履歴が保存されなくなる。
どのコマンドも history に記録されない。

履歴機能を動的にON/OFFする

コマンドの入力前に以下を実行する。

履歴機能をオフにする

set +o history

コマンドを入力

[何かしらのコマンド]

履歴機能をオンにする

set -o history

特定の行の履歴を削除する方法

履歴の中から、誤って入力したコマンドやセキュリティ上残しておきたくないコマンドを削除したい場合に便利

history -d <行番号>

で可能。

行番号については、一度 historyコマンドで確認する必要がある。

おわりに

セキュリティ的に残したくないコマンドがある場合、例えば export=AWS_SECRET_KEY= みたいに秘密情報を一時的な環境変数として定義したい場合があったので今回の履歴を残さない方法を調査した。
結構いろいろな方法があるので覚えておきたいが、特に使いやすいのは一時的に履歴機能をオンオフする方法な気がする。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。