Como posso executar um script imediatamente após a conexão via SSH?

22

Comecei a fazer esta pergunta, mas respondi enquanto estava aberta. Vou postar esta pergunta, acompanhá-la com a minha solução e deixá-la aberta a outras possíveis soluções.

< backstory >

Sou um usuário tmux e vim. Eu gosto do trabalho remoto do vim, já que não tenho que me preocupar com as máquinas de desenvolvimento do Ubuntu aparecendo quando um filme em flash me dá um pânico no kernel. Rodar o tmux significa que arquivos abertos estão esperando por mim depois que eu reinicio e posso continuar de onde parei. Eu tive problemas com o vim rodando em uma sessão do tmux quando eu conecto assim:

ssh example.com -t 'tmux attach'

Surgem problemas de UTF-8 que não surgem ao descascar normalmente e apenas se ligam a uma sessão do tmux manualmente.

< / backstory >

Então eu quero um método reutilizável de iniciar algo no login do ssh, que não afeta nenhuma das outras coisas que eu configurei no meu .zshrc (ou seu .bashrc se você ainda usar o bash) que pode ser necessário para o meu ambiente de desenvolvimento, isso não aparece quando ocasionalmente estou trabalhando localmente na mesma máquina.

    
por connrs 22.03.2011 / 13:20

6 respostas

13

Quando você executa ssh example.com , o daemon ssh inicia um shell de login e o shell de login lê seu ~/.profile (ou ~/.bash_profile ou ~/.zprofile ou ~/.login dependendo do seu shell de login). Quando você especifica um comando para ser executado remotamente (com ou sem -t ), o daemon ssh inicia um shell comum, portanto, seu .profile não é lido. Solução:

ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'

A maioria dos daemons ssh são configurados para recusar variáveis de ambiente de transmissão, exceto LC_* . Se o daemon ssh em example.com permitir, você pode abusar de uma variável LC_* personalizada para iniciar o tmux automaticamente - coloque isso em seu ~/.profile :

if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
  exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
  exec tmux attach
fi

faça o login com LC_tmux_session= ssh example.com ou LC_tmux_session=session_name ssh example.com .

Esta resposta tem mais informações sobre passar variáveis de ambiente em ssh.

    
por 22.03.2011 / 22:35
6

Eu já recomendei definir PermitUserEnvironment yes e adicionar uma variável de ambiente em ~/.ssh/environment até Eli Heady contribuiu com uma sugestão melhor nos comentários abaixo.

Abra o seu .zlogin (bash: .bash_profile etc.) e coloque o seguinte:

if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
    while true; do
        echo -n "Do you want to attach to a tmux session? [y/n]"
        read yn
        case $yn in
            [Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
            [Nn]* ) break;;
            * ) echo "Please answer y/n";;
        esac
    done
fi

Inspiração tirada de: Como faço para solicitar a entrada em um script de shell do Linux?

Note que eu usei o arquivo .zlogin , mas você pode usar o arquivo .zshrc , mas eu gosto de manter meus arquivos de ponto arrumados e o separa para que eu possa usá-lo em outras máquinas.

Substitua a pergunta por algo apropriado e substitua MY_SSH_CONNECTION="yes" tmux attach pelo que você deseja executar nesse ponto.

Observe como o script define MY_SSH_CONNECTION="yes" antes de tmux attach para passá-lo para o tmux, pois ele também abrirá um shell que acessará o mesmo script acima e evitará qualquer recursão.

    
por 22.03.2011 / 13:20
3

Eu adiciono isso aos meus arquivos .bash_profile:

if [ -z "$STY" ]; then
    reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

Isso me dá algum tempo para abortar a reconexão ou a criação de uma sessão de tela. Não funcionará nos formatos 'ssh system command' (que não chama o perfil ~ /.*). Uma função shell é configurada para reconectar se eu cancelar.

    
por 22.03.2011 / 14:16
0

Você pode considerar a execução

ssh remotehost -t screen -DR

e execute sua sessão de terminal lá. Você pode então desanexar ( ^A^D ) e reconectar depois (de um cliente diferente também). Isso fará com que o problema com a inicialização não interativa desapareça à medida que a tela mantém sessões de terminal completas e interativas (opcionalmente, também shells de logon, man screen (1) ou ^A? )

    
por 23.03.2011 / 01:49
0

Para falar especificamente sobre os problemas do UTF-8, se você adicionar

SendEnv LANG

E $LANG está definido para algo como en_US.UTF-8 na extremidade local e seu sshd na extremidade remota permite a diretiva SendEnv (com AcceptEnv in sshd_config ), o tmux na outra extremidade deve honre isso. Eu tive esse problema por um tempo e foi difícil solucionar problemas.

    
por 18.05.2013 / 22:45
0

Se você quiser que ele seja executado toda vez que se conectar, basta adicionar tmux attach à parte inferior do seu ~/.profile na máquina remota.

    
por 08.11.2013 / 18:47