SSH LocalCommand à la sortie

9

Dans, ~/.ssh/configvous pouvez utiliser la LocalCommanddirective pour exécuter une commande locale chaque fois que vous vous connectez à une machine distante via SSH. Mais comment exécuter une commande lorsque je quitte une connexion SSH? Il semble que les fichiers * .bashrc / .bash_profile * ne proviennent pas lorsque la connexion se termine ou est fermée.

Roberto Aloi
la source
Cette question est étroitement liée à unix.stackexchange.com/questions/40830/…
Bananguin

Réponses:

11

Il n'est pas spécifié dans la question si vous souhaitez que cela soit exécuté sur la machine locale ou distante. Il n'est également pas spécifié quel shell est présent sur l'une ou l'autre machine, donc je suppose bashpour les deux.

Si vous souhaitez l'exécuter sur la machine distante, regardez ~/.bash_logoutce qui est exécuté lorsqu'un shell de connexion se déconnecte correctement. De man bash:

Lorsqu'un shell de connexion se ferme, bash lit et exécute les commandes du fichier ~/.bash_logout, s'il existe.

Vous pouvez effectuer un test ~/.bash_logoutpour vérifier si le shell en cours de déconnexion est une session SSH, quelque chose comme ce qui suit devrait fonctionner:

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

Si vous souhaitez l'exécuter sur la machine locale, créez un wrapper de fonction autour ssh. Quelque chose comme ce qui suit devrait fonctionner:

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

Cela peut être trop simple pour vos besoins, mais vous avez l'idée.

Chris Down
la source
J'avais besoin que la commande soit exécutée sur la machine locale. Merci pour la suggestion. Cela fonctionne bien.
Roberto Aloi
1

Tu es sur la bonne piste. Si la sshsession est un shell de connexion (au lieu d'une commande à distance), bashsera source /etc/bash.logoutet ~/.bash_logoutlorsque vous quitterez le shell.

Si vous souhaitez exécuter une commande à distance, vous pouvez forcer bashà être un shell de connexion. Le LocalCommandpourrait être similaire à ceci:

bash -l -c /execute/some/command

De 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
la source
1
Pas si vous exécutez une commande distante (si la commande est spécifiée, elle est exécutée sur l'hôte distant au lieu d'un shell de connexion.). Cependant, en lisant la question OP de plus près, il semble qu'il veuille que quelque chose se passe localement, donc je pense que votre réponse est plus appropriée.
George M