Historial en bashrc al iniciar sesión versus abastecimiento manual: limpieza y carga

Historial en bashrc al iniciar sesión versus abastecimiento manual: limpieza y carga

Utilizo un montón de máquinas Aix diferentes en el trabajo y necesito compartir usuarios con compañeros de trabajo.

Para hacer mi vida más fácil pero no molestar a otros con mis personalizaciones, he creado un archivo .bashrc que copio a /tmp/matthewh cada vez que tengo que usar un nuevo host.

Mi .bashrc establece un nuevo archivo de historial para que mi historial de comandos personal permanezca aislado de otros que usan la misma máquina y usuario.

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

Después de copiar el archivo, me conecto con ssh user@host -t "bash --rcfile /tmp/matthewh/.bashrc".

Esto funciona perfectamente. El problema ocurre cuando cambio a otro usuario y obtengo el archivo .bashrc.

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

El problema es que la inicial su - apachecarga el historial de Apache desde ~/.bash_history y luego, cuando obtengo .bashrc, ya es demasiado tarde. El archivo histórico se modifica correctamente pero ya se ha cargado. Puedo solucionar este problema ejecutando history -c && history -r, así que todo lo que tengo que hacer es ponerlo también en .bashrc y todo debería estar bien, ¿verdad?

Desafortunadamente, si pongo eso en mi archivo .bashrc, se rompen las cosas cuando inicio sesión con sshla -t "bash --rcfile /tmp/matthewh/.bashrc"opción. Dado que esto lo genera como un shell de inicio de sesión, cargar el historial es parte del proceso. Esto significa que history -ren .bashrc carga el historial por segunda vez y mi historial de trabajo es el doble de grande de lo que debería ser.

¿Hay alguna forma de que .bashrc detecte si se obtiene manualmente o desde un shell de inicio de sesión para que solo pueda borrar y recargar el historial de forma condicional?

Respuesta1

En lugar de borrar y volver a cargar el historial en el archivo rc, pospóngalo hasta que el shell emita el primer mensaje:

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

Respuesta2

Una forma es averiguar si las variables SSH están configuradas:

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

Cuando haga "su -", estos no se configurarán en el nuevo entorno. Entonces, podrías agregar algo como:

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

Respuesta3

Una solución es comprobar si el archivo histórico está vacío o no:

# 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

Era necesario usar ${currhistsize// } porque tenía un montón de espacios en blanco iniciales que debían eliminarse.

Sin embargo, esto parece una solución alternativa y no una solución real. Me interesaría mucho encontrar una forma adecuada de comprobar si el archivo se obtiene manualmente o desde una inicialización del shell.

Respuesta4

Bien, aquí tienes otra idea. Cada sesión de bash tendrá una identificación única. Solo para estar seguro, también puedes crear una marca de tiempo única. Esto no resolverá directamente su problema y no estoy seguro de que funcione mientras lo escribo, pero cualquier shell nuevo creará su propio archivo histórico basado en PID y marca de tiempo.

Puedes poner en el .bashrc algo como

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

Al menos así mantienes todo separado.

No probado, por lo que si opta por este tipo de idea, probablemente necesite modificarla hasta que funcione :)

información relacionada