로그인 시 bashrc 기록과 수동 소싱 비교 - 지우기 및 로드

로그인 시 bashrc 기록과 수동 소싱 비교 - 지우기 및 로드

저는 직장에서 다양한 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"

최소한 그런 식으로 모든 것을 분리해 두세요.

테스트되지 않았으므로 이러한 유형의 아이디어를 사용한다면 작동할 때까지 조정해야 할 것입니다. :)

관련 정보