我在工作中使用一堆不同的 aix 機器,並且需要與同事分享使用者。
為了讓我的生活更輕鬆,但又不讓我的自訂打擾其他人,我創建了一個 .bashrc 文件,每當我必須使用新主機時,我都會將其複製到 /tmp/matthewh。
我的 .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 中,一切都應該沒問題,對吧?
ssh
不幸的是,如果我將其放入 .bashrc 檔案中,當我使用和選項登入時,它會破壞一些東西-t "bash --rcfile /tmp/matthewh/.bashrc"
。由於它將其作為登入 shell 的來源,因此載入歷史記錄是該過程的一部分。這意味著history -r
.bashrc 中的 會第二次載入歷史記錄,而我的工作歷史記錄是應有的兩倍。
有沒有辦法讓 .bashrc 偵測它是手動取得還是從登入 shell 獲取,以便它只能有條件地清除和重新載入歷史記錄?
答案1
不要清除並重新載入 rc 檔案中的歷史記錄,而是將其推遲到 shell 發出第一個提示時:
PROMPT_COMMAND='unset PROMPT_COMMAND; test -f $HISTFILE && history -c && history -r $HISTFILE'
答案2
一種方法是尋找 SSH 變數是否已設定:
SSH_CLIENT='...'
SSH_CONNECTION='...'
SSH_TTY=/dev/pts/1
當你“su -”時,這些將不會在新環境中設定。所以,你可以加入類似的內容:
[ -z "$SSH_TTY" ] && history -c && history -r
答案3
一種解決方案是檢查歷史文件是否為空:
# 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// },因為它有一堆前導空格需要刪除。
這感覺像是一種解決方法,而不是真正的解決方案。我對檢查檔案是手動取得還是從 shell 初始化取得的正確方法非常感興趣。
答案4
好吧,這是另一個想法。每個 bash 會話都有一個唯一的 id。只是為了確保您也可以創建唯一的時間戳。這不會直接解決你的問題,而且我不確定這在我編寫它時是否有效,但任何新的 shell 都會根據 PID 和時間戳創建自己的歷史文件
你可以在 .bashrc 放入類似的內容
mypid=echo $$
mydatestamp=`date +"%Y%m%d_%H%M%S"`
export HISTFILE="/root/historyfiles/$mypid.$mydatestamp.bash_history"
至少你可以這樣把所有東西分開。
未經測試,因此如果您採用這種類型的想法,可能需要調整它直到它起作用:)