Histórico no bashrc no login vs fornecimento manual - limpeza e carregamento

Histórico no bashrc no login vs fornecimento manual - limpeza e carregamento

Eu uso várias máquinas aix diferentes no trabalho e preciso compartilhar usuários com colegas de trabalho.

Para facilitar minha vida, mas não incomodar outras pessoas com minhas personalizações, criei um arquivo .bashrc que copio para /tmp/matthewh sempre que preciso usar um novo host.

Meu .bashrc define um novo arquivo de histórico para que meu histórico de comandos pessoal permaneça isolado de outros que usam a mesma máquina e usuário.

# History options
export HISTTIMEFORMAT="%F %T "
export HISTCONTROL=ignorespace 
export HISTSIZE=2000
export HISTFILESIZE=2000
export HISTFILE="/tmp/matthewh/$USER.bash_history"

Depois de copiar o arquivo, eu me conecto com o ssh user@host -t "bash --rcfile /tmp/matthewh/.bashrc".

Isso funciona perfeitamente. O problema ocorre quando mudo para outro usuário e obtenho o arquivo .bashrc.

$ su - apache
$ . /tmp/matthewh/.bashrc

O problema é que a inicialização su - apachecarrega o histórico do Apache de ~/.bash_history e, quando eu forneço .bashrc depois, é tarde demais. O arquivo de histórico foi alterado corretamente, mas já foi carregado. Posso corrigir esse problema executando history -c && history -r, então tudo que preciso fazer é colocar isso no .bashrc também e tudo ficará bem, certo?

Infelizmente, se eu colocar isso em meu arquivo .bashrc, ele quebrará as coisas quando eu fizer login com ssha -t "bash --rcfile /tmp/matthewh/.bashrc"opção. Como isso o origina como um shell de login, carregar o histórico faz parte do processo. Isso significa que o history -r.bashrc carrega o histórico uma segunda vez e meu histórico de trabalho é duas vezes maior do que deveria.

Existe uma maneira de .bashrc detectar se ele está sendo obtido manualmente ou a partir de um shell de login, para que possa apenas limpar e recarregar o histórico condicionalmente?

Responder1

Em vez de limpar e recarregar o histórico no arquivo rc, adie-o até que o shell emita o primeiro prompt:

PROMPT_COMMAND='unset PROMPT_COMMAND; test -f $HISTFILE && history -c && history -r $HISTFILE'

Responder2

Uma maneira é descobrir se as variáveis ​​SSH estão definidas:

SSH_CLIENT='...'
SSH_CONNECTION='...'
SSH_TTY=/dev/pts/1

Quando você "su -", eles não serão definidos no novo ambiente. Então, você poderia adicionar algo como:

[ -z "$SSH_TTY" ] && history -c && history -r

Responder3

Uma solução é verificar se o arquivo de histórico está vazio ou não:

# 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

Foi necessário usar ${currristize// } porque havia vários espaços em branco à esquerda que precisavam ser removidos.

Isso parece uma solução alternativa e não uma solução real. Eu estaria muito interessado em uma maneira adequada de verificar se o arquivo está sendo obtido manualmente ou a partir de uma inicialização do shell.

Responder4

Ok, aqui está outra ideia. Cada sessão bash terá um ID exclusivo. Só para ter certeza, você também pode criar um carimbo de data/hora exclusivo. Isso não resolverá diretamente o seu problema e não tenho certeza se funcionará enquanto estou escrevendo, mas qualquer novo shell criará seu próprio arquivo de histórico com base no PID e no carimbo de data / hora

Você pode colocar no .bashrc algo como

mypid=echo $$
mydatestamp=`date +"%Y%m%d_%H%M%S"`
export HISTFILE="/root/historyfiles/$mypid.$mydatestamp.bash_history"

Pelo menos você mantém tudo separado dessa forma.

Não testado, então se você seguir esse tipo de ideia provavelmente precisará ajustá-la até que funcione :)

informação relacionada