SSH LocalCommand en la salida

9

En ~/.ssh/configpuede usar la LocalCommanddirectiva para ejecutar un comando local siempre que se conecte a una máquina remota a través de SSH. Pero ¿cómo ejecutar un comando cuando salgo de una conexión SSH? Parece que los archivos * .bashrc / .bash_profile * no se obtienen cuando la conexión finaliza o se cierra.

Roberto Aloi
fuente
Esta pregunta está estrechamente relacionada con unix.stackexchange.com/questions/40830/…
Bananguin

Respuestas:

11

No se especifica en la pregunta si desea que esto se ejecute en la máquina local o remota. Tampoco se especifica qué shell está presente en ninguna de las máquinas, por lo que supongo bashque ambas.

Si desea ejecutarlo en la máquina remota, mire ~/.bash_logout, que se ejecuta cuando un shell de inicio de sesión se cierra correctamente. De man bash:

Cuando sale un shell de inicio de sesión, bash lee y ejecuta comandos del archivo ~/.bash_logout, si existe.

Puede hacer una prueba ~/.bash_logoutpara verificar si el shell que está cerrando sesión es una sesión SSH, algo como lo siguiente debería funcionar:

if [[ $SSH_CLIENT || $SSH_CONNECTION || $SSH_TTY ]]; then
    # commands go here
fi

Si desea ejecutarlo en la máquina local, cree un contenedor de funciones ssh. Algo como lo siguiente debería funcionar:

ssh() {
    if command ssh "$@"; then
        # commands go here
    fi
}

Eso puede ser demasiado simple para sus necesidades, pero se entiende la idea.

Chris Down
fuente
Necesitaba que el comando se ejecutara en la máquina local. Gracias por la sugerencia. Funciona sin problemas.
Roberto Aloi
1

Estás en el camino correcto. Si la sshsesión es un shell de inicio de sesión (en lugar de un comando remoto), se bashgenerará /etc/bash.logouty ~/.bash_logoutcuando salga del shell.

Si desea ejecutar un comando remoto, puede forzarlo basha ser un shell de inicio de sesión. El LocalCommandpodría ser similar a esto:

bash -l -c /execute/some/command

Desde man 1 bash

-c string   If  the  -c  option  is  present, then commands are read from 
string.  If there are arguments after the string, they are assigned to 
the positional parameters,  starting with $0.
-l   Make bash act as if it had been invoked as a login shell 

When  a login shell exits, bash reads and executes commands from the 
files ~/.bash_logout and /etc/bash.bash_logout, if the files exists.
George M
fuente
1
No si se ejecuta un comando remoto (si se especifica el comando, se ejecuta en el host remoto en lugar de un shell de inicio de sesión). Sin embargo, al leer la pregunta de OP más de cerca, parece que quiere que algo suceda localmente, así que creo que su respuesta es más apropiada.
George M