Como posso encaminhar uma chave ssh já encaminhada para o tmux?

15

Estou conectando através do SSH a partir de uma máquina na qual minhas chaves estão armazenadas, encaminhando para uma segunda máquina e, em seguida, tento usá-las no tmux. Eu pareço "perder" o encaminhamento ao entrar no tmux. Como "encaminhar novamente" para que eu possa usar minhas chaves no tmux?

$ ssh [server] -o ForwardAgent=yes
$ git pull       # Succeeds.
$ /bin/bash
$ git pull       # Still succeeds, despite new shell.
$ exit
$ tmux attach
$ git pull       # Permission denied (publickey)
user50849
fonte
Confirmo que, se você iniciar um agente compartilhado entre todas as suas sessões, ele funcionará. A documentação em bose.utmb.edu/Compu_Center/ssh/SSH_HOWTO.html > Configurar o processo ssh-agent explica um método para alcançar esse resultado.
Dereckson

Respostas:

12

Se você estiver anexando uma sessão tmux já existente, o shell não herdará as variáveis ​​de ambiente do seu shell de login. Particularmente, não herdará as variáveis ​​de ambiente do agente ssh.

Tente esta correção :

  1. Crie esse script e coloque-o em $ HOME / .ssh / saveagent

    #!/bin/sh
    SSHVARS="SSH_CLIENT SSH_TTY SSH_AUTH_SOCK SSH_CONNECTION DISPLAY"
    
    for var in ${SSHVARS} ; do
      echo "export $var=\"$(eval echo '$'$var)\""
    done 1>$HOME/.ssh/latestagent
  2. Adicione-o ao seu script de inicialização do shell. Por exemplo, se você usar o bash:

    echo '. ~/.ssh/saveagent' >> ~/.bash_login
  3. Após conectar o tmux, execute . $HOME/.ssh/latestagent

Consulte também Como executar um script imediatamente após a conexão via SSH? e Anexe à sessão do tmux e execute um comando

GnP
fonte
1
Envie para .profile talvez, se você estiver tentando ser compatível com outras conchas.
Dereckson
2
Ótima resposta! Algumas questões Corri para: a - algumas das variáveis de ambiente conter espaços, para que a linha antes da última no saveagentscript deve ser: echo "export $var=\"$(eval echo '$'$var)\"". b - o latestagentscript deve ser chamado com em sourcevez de sh, portanto, definir as variáveis ​​afetará o shell de chamada. c - chamar o latestagentscript automaticamente ao anexar o tmux pode ser feito através do método descrito aqui: unix.stackexchange.com/questions/86925/…
Joe
Obrigado @ Joe, modifiquei minha resposta para incluir suas melhorias.
GnP
0

A menos que você deseje obter um script que contenha todas as variáveis ​​necessárias em todos os shell gerados em qualquer novo shell gerado pelas mesmas tmuxsessões do servidor, você provavelmente precisará informar tmuxpara colocar as variáveis ​​na sessão ou nos ambientes globais com o set-environmentcomando Por exemplo, como este (para o bash):

for var in DISPLAY SSH_AUTH_SOCK ...; do
    tmux setenv "$var" "${!var}"
done

lembre-se de adicionar o -gsinalizador, se você o quiser em outras sessões, e usá- -t <session>lo se estiver executando-o de fora tmux.

peterph
fonte
0

Depois de ler as outras respostas aqui, decidi copiar meu par de chaves público / privado no servidor remoto, para que não precisasse mais me preocupar com o encaminhamento de agentes.

Scott Ford
fonte