はじめに
TeraTermマクロ(TTL)で定期的にサーバー操作を自動化していると、historyが自動実行のコマンドだらけになります。今回は、TTLの冒頭に1行追加するだけで、そのセッションの操作を一切履歴に残さない方法を紹介します。
解決策
ssh接続してログインする処理の直後に、以下を挿入します
sendln 'set +o history; unset HISTFILE'
説明
まず、Linuxサーバにおいて履歴を残さない方法としてunset HISTFILEは有名です。
Bashは通常、セッション終了時にメモリ上の履歴を $HISTFILE で指定されたファイル(通常は .bash_history)に書き出します。 この変数自体を消去(unset)することで、ログアウト時の書き出し処理を物理的に無効化します。
注意
あくまで現在実行中のセッションの変数を削除しているだけです。
設定ファイル自体を書き換えるわけではないため、再ログインすれば元の設定に戻ります。
1. unset HISTFILEは即時保存設定にも有効
環境によっては、コマンド履歴を即座に保存しているものもあります。
参考↓
こういう環境であっても、セッションの最初にunset HISTFILEを実行していれば、履歴に残りません。
2.ではどうして、set +o historyが必要なのか
「最初に unset するなら、それだけで十分ではないか?」という疑問が浮かびますが、あえて set +o history を重ねるのには、不特定多数の環境を相手にする際の理由があります。
①HISTFILEがreadonlyになっているときの対策
稀に、設定で HISTFILE 変数が readonlyに固定されている環境があります。この場合 unset は失敗し、以下のエラーがでます
bash: HISTFILE: cannot unset: readonly variable
②実行中の覗き見防止
unset HISTFILE はファイルへの保存を防ぎますが、メモリには履歴を蓄積し続けます。 もし自動処理が動いている最中に、別のターミナルから管理者がログインして history コマンドを叩いた場合、現在進行中の自動操作コマンドがすべて丸見えになってしまいます。
まとめ
自動処理の対象サーバ環境を完全に把握しているのであればunset HISTFILEだけでも十分かもしれません。しかし、不特定多数のサーバを対象とする場合は、どんな環境か把握できていないことが多いので、2段構えでいくと安全だと考えます。
1. set +o history で「記録」を止める
2. unset HISTFILE で「保存先」を消す