SSH LocalCommand na saída

9

Em ~/.ssh/configvocê pode usar a LocalCommanddiretiva para executar um comando local sempre que você se conectar a uma máquina remota via SSH. Mas como executo um comando quando saio de uma conexão SSH? Parece que os arquivos * .bashrc / .bash_profile * não são originados quando a conexão termina ou é fechada.

Roberto Aloi
fonte
Esta questão está intimamente relacionada a unix.stackexchange.com/questions/40830/…
Bananguin

Respostas:

11

Não está especificado na pergunta se você deseja que isso seja executado na máquina local ou remota. Também não está especificado qual shell está presente em nenhuma das máquinas, portanto, estou assumindo as bashduas.

Se você deseja executá-lo na máquina remota, observe ~/.bash_logout, que é executado quando um shell de logon efetua logout normalmente. De man bash:

Quando um shell de login sai, o bash lê e executa comandos do arquivo ~/.bash_logout, se existir.

Você pode fazer um teste ~/.bash_logoutpara verificar se o shell que está sendo desconectado é uma sessão SSH, algo como o seguinte deve funcionar:

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

Se você deseja executá-lo na máquina local, crie um wrapper de função ssh. Algo como o seguinte deve funcionar:

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

Isso pode ser muito simples para suas necessidades, mas você entendeu.

Chris Down
fonte
Eu precisava que o comando fosse executado na máquina local. Obrigado pela sugestão. Funciona sem problemas.
Roberto Aloi
1

Você está no caminho certo. Se a sshsessão for um shell de login (em vez de um comando remoto), basha fonte será /etc/bash.logoute ~/.bash_logoutquando você sair do shell.

Se você deseja executar um comando remoto, pode forçar basha ser um shell de logon. O LocalCommandpoderia ser semelhante a este:

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
fonte
11
Não se estiver executando um comando remoto (se o comando for especificado, ele será executado no host remoto em vez de no shell de logon). No entanto, lendo a pergunta do OP mais de perto, parece que ele quer que algo aconteça localmente, então acho que você responde é mais apropriado.
George M