저는 직장에서 다양한 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에서 아파치 기록을 로드한 다음 나중에 .bashrc를 소스로 사용하면 너무 늦었다는 것입니다. 기록 파일이 올바르게 변경되었지만 이미 로드되었습니다. 를 실행하여 이 문제를 해결할 수 있으므로 history -c && history -r
이를 .bashrc에 추가하기만 하면 모든 것이 문제가 없을 것입니다. 그렇죠?
불행하게도 이를 .bashrc 파일에 넣으면 ssh
해당 -t "bash --rcfile /tmp/matthewh/.bashrc"
옵션으로 로그인할 때 문제가 발생합니다. 이는 로그인 셸로 소스를 제공하므로 기록을 로드하는 것이 프로세스의 일부입니다. 이는 history -r
.bashrc의 파일이 두 번째로 기록을 로드하고 내 작업 기록이 예상보다 두 배 크다는 것을 의미합니다.
.bashrc가 수동으로 소스인지 또는 로그인 셸에서 소스인지 감지하여 조건에 따라 기록을 지우고 다시 로드할 수 있는 방법이 있습니까?
답변1
rc 파일의 기록을 지우고 다시 로드하는 대신 셸이 첫 번째 프롬프트를 표시할 때까지 연기하세요.
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// }를 사용해야 했습니다.
이것은 해결 방법처럼 느껴지지만 실제 해결책은 아닙니다. 파일이 수동으로 소스인지 또는 쉘 초기화에서 소스인지 확인하는 적절한 방법에 매우 관심이 있습니다.
답변4
좋습니다. 또 다른 아이디어가 있습니다. 각 bash 세션에는 고유한 ID가 있습니다. 고유한 타임스탬프도 만들 수 있는지 확인하세요. 이것이 문제를 직접적으로 해결할 수는 없으며, 이 글을 쓰고 있는 현재에도 이것이 작동할지는 확신할 수 없습니다. 그러나 새로운 쉘은 PID와 타임스탬프를 기반으로 자체 히스토리 파일을 생성할 것입니다.
.bashrc에 다음과 같은 것을 넣을 수 있습니다.
mypid=echo $$
mydatestamp=`date +"%Y%m%d_%H%M%S"`
export HISTFILE="/root/historyfiles/$mypid.$mydatestamp.bash_history"
최소한 그런 식으로 모든 것을 분리해 두세요.
테스트되지 않았으므로 이러한 유형의 아이디어를 사용한다면 작동할 때까지 조정해야 할 것입니다. :)