В ~/.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.