職場ではさまざまな AIX マシンを使用しており、同僚とユーザーを共有する必要があります。
自分の作業を楽にしつつ、カスタマイズで他の人に迷惑をかけないようにするために、新しいホストを使用する必要があるときはいつでも /tmp/matthewh にコピーする .bashrc ファイルを作成しました。
私の .bashrc は新しい履歴ファイルを設定するので、私の個人的なコマンド履歴は、同じマシンとユーザーを使用する他のユーザーの履歴から分離されたままになります。
# History options
export HISTTIMEFORMAT="%F %T "
export HISTCONTROL=ignorespace
export HISTSIZE=2000
export HISTFILESIZE=2000
export HISTFILE="/tmp/matthewh/$USER.bash_history"
ファイルをコピーした後、 で接続しますssh user@host -t "bash --rcfile /tmp/matthewh/.bashrc"
。
これは完璧に動作します。問題は、別のユーザーに切り替えて .bashrc ファイルをソースすると発生します。
$ su - apache
$ . /tmp/matthewh/.bashrc
問題は、最初にsu - apache
~/.bash_history から Apache の履歴をロードし、その後 .bashrc をソースしたときには遅すぎることです。履歴ファイルは正しく変更されますが、すでにロードされています。 を実行することでこの問題を修正できます。history -c && history -r
つまり、それを .bashrc にも追加するだけで、すべてうまくいくはずですよね?
残念ながら、これを .bashrc ファイルに入れるとssh
、-t "bash --rcfile /tmp/matthewh/.bashrc"
オプションを使用してログインするときに問題が発生します。これはログイン シェルとしてソースとなるため、履歴の読み込みはプロセスの一部です。つまり、history -r
.bashrc では履歴が 2 度読み込まれ、作業履歴は本来の 2 倍の大きさになります。
.bashrc が手動でソースされているか、ログイン シェルからソースされているかを検出して、条件付きでのみ履歴をクリアして再ロードできるようにする方法はありますか?
答え1
rc ファイルの履歴をクリアして再ロードする代わりに、シェルが最初のプロンプトを発行するまで延期します。
PROMPT_COMMAND='unset PROMPT_COMMAND; test -f $HISTFILE && history -c && history -r $HISTFILE'
答え2
1 つの方法は、SSH 変数が設定されているかどうかを確認することです。
SSH_CLIENT='...'
SSH_CONNECTION='...'
SSH_TTY=/dev/pts/1
「su -」を実行すると、これらは新しい環境では設定されません。そのため、次のようなものを追加できます。
[ -z "$SSH_TTY" ] && history -c && history -r
答え3
1 つの解決策は、履歴ファイルが空かどうかを確認することです。
# If this was sourced manually history will not be empty
currhistsize="`history | wc -l`"
if [[ "${currhistsize// }" != "0" ]]; then
# Clear the old history, then reload the correct history
history -c
history -r
fi
先頭の空白文字が大量に削除する必要があったため、${currhistsize// } を使用する必要がありました。
ただし、これは回避策のようで、実際の解決策ではありません。ファイルが手動で取得されているか、シェルの初期化から取得されているかを確認する適切な方法に非常に興味があります。
答え4
さて、別のアイデアがあります。各 bash セッションには一意の ID があります。念のため、一意のタイムスタンプも作成できます。これで問題が直接解決されるわけではありませんし、私がこれを書いている時点ではこれが機能するかどうかはわかりませんが、新しいシェルは PID とタイムスタンプに基づいて独自の履歴ファイルを作成します。
.bashrcに次のような記述を入れます
mypid=echo $$
mydatestamp=`date +"%Y%m%d_%H%M%S"`
export HISTFILE="/root/historyfiles/$mypid.$mydatestamp.bash_history"
少なくとも、そのようにすればすべてを分離しておくことができます。
テストされていないので、このタイプのアイデアを採用する場合は、動作するまで調整する必要がある可能性があります :)