SSH LocalCommand при выходе

9

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

Роберто Алои
источник
Этот вопрос тесно связан с unix.stackexchange.com/questions/40830/…
Bananguin

Ответы:

11

В вопросе не указано, хотите ли вы, чтобы это выполнялось на локальной или удаленной машине. Также не указано, какая оболочка присутствует на любой машине, поэтому я предполагаю 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
}

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

Крис Даун
источник
Мне нужно было выполнить команду на локальной машине. Спасибо за предложение. Работает плавно.
Роберто Алой
1

Ты на правильном пути. Если 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.
Джордж М
источник
1
Не при выполнении удаленной команды (если указана команда, она выполняется на удаленном хосте вместо оболочки входа в систему). Однако, читая вопрос об ОП ближе, кажется, он хочет, чтобы что-то происходило локально, поэтому я думаю, что ваш ответ более уместен.
Джордж М