SSH LocalCommand при выходе

SSH LocalCommand при выходе

В ~/.ssh/configвы можете использовать LocalCommandдирективу для выполнения локальной команды всякий раз, когда вы подключаетесь к удаленной машине через SSH. Но как мне выполнить команду, когда яВыходSSH-подключение? Похоже, что файлы *.bashrc/.bash_profile* не являются исходными, когда соединение завершается или закрывается.

решение1

В вопросе не указано, хотите ли вы, чтобы это было выполнено на локальной или удаленной машине. Также не указано, какая оболочка присутствует на каждой из машин, поэтому я предполагаю bashдля обеих.

Если вы хотите выполнить его на удаленной машине, посмотрите на ~/.bash_logout, который выполняется при корректном выходе из оболочки входа. Из man bash:

При выходе из оболочки входа bash считывает и выполняет команды из файла ~/.bash_logout, если он существует.

Вы можете выполнить тест, ~/.bash_logoutчтобы проверить, является ли оболочка, из которой осуществляется выход, сеансом SSH. Должно сработать что-то вроде следующего:

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

Если вы хотите выполнить его на локальной машине, создайте обертку функции вокруг ssh. Должно сработать что-то вроде следующего:

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

Это может быть слишком просто для ваших нужд, но вы поняли идею.

решение2

Вы на правильном пути. Если sshсеанс является оболочкой входа (а не удаленной командой), bashбудет источник /etc/bash.logoutи ~/.bash_logoutпри выходе из оболочки.

Если вы хотите выполнить удаленную команду, то вы можете принудительно bashперейти в оболочку входа. Это LocalCommandможет быть похоже на это:

bash -l -c /execute/some/command

От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.

Связанный контент