Como posso obter o ssh-agent trabalhando no ssh e no tmux (no OS X)?


17

Tenho uma chave privada configurada para minha conta do github, cuja senha é, acredito, armazenada no chaveiro do OS X. Certamente não preciso digitá-lo quando abro uma janela do terminal e entro ssh git@github.com.

No entanto, quando estou executando o bash em uma sessão ssh, ou localmente dentro de uma sessão tmux, tenho que digitar a senha sempre que tento ssh no github.

Esta pergunta sugere que existe um problema semelhante com a tela, mas eu realmente não entendo o problema o suficiente para corrigi-lo no tmux. Há também esta página que inclui uma solução bastante complicada, mas para o zsh.

EDIT :

Em resposta à resposta de @ Mikel , de um terminal local, recebo a seguinte saída:

[~]
$ echo $SSH_AUTH_SOCK
/tmp/launch-S4HBD6/Listeners
[~] 
$ ssh-add -l
2048 [my key fingerprint] /Users/richie/.ssh/id_rsa (RSA)
[~]
$ typeset -p SSH_AUTH_SOCK
declare -x SSH_AUTH_SOCK="/tmp/launch-S4HBD6/Listeners"

Enquanto over ssh ou tmux eu recebo:

[~]
$ echo $SSH_AUTH_SOCK

[~]
$ ssh-add -l
Could not open a connection to your authentication agent.
[~]
$ typeset -p SSH_AUTH_SOCK
bash: typeset: SSH_AUTH_SOCK: not found

echo $SSH_AGENT_PID não retorna nada, seja qual for o shell em que eu o execute.


Que tal typeset -p SSH_AUTH_SOCK?
Mikel

@ Mikel a bash: typeset: SSH_AUTH_SOCK: not foundpartir do ssh / tmux. Vou tentar localmente hoje à noite, se necessário.
Rich

@ Mikel Adicionei a saída desse comando à pergunta.
Rich

AFAIK, perguntas e respostas não são específicas do OS X. Isso é relevante para evitar alguns dups não específicos do OS X, como superuser.com/q/334975/46794 e superuser.com/q/479796/46794 .
Blaisorblade 19/09/2013

@ Blaisorblade Fiquei com a impressão de que minha frase secreta estava armazenada no chaveiro do OS X (embora eu não me lembre agora porque eu acreditava que era esse o caso). Isso está incorreto?
Rico

Respostas:


4

Meu colega criou algumas funções do bash para ajudar a encontrar um agente ativo : https://github.com/wwalker/ssh-find-agent

Ele o usa principalmente para conectar-se entre sistemas (laptop a desktop, etc), mas eu o uso com mais frequência em sessões locais do tmux, nas quais você efetua logout / logon no gerenciador de janelas (OS X para mim).

Uso

  1. Faça o download do ssh-find-agent.bash ( git clone git://github.com/wwalker/ssh-find-agent.gitfunciona).

  2. Adicione o seguinte ao ~ / .bashrc:

    . /path/to/ssh-find-agent.bash
    
  3. Em seguida, você pode digitar o seguinte para definir SSH_AUTH_SOCK no seu shell atual:

    set_ssh_agent_socket
    

Aceitei esta resposta em vez de qualquer outra que possa funcionar porque não requer o encaminhamento de agente SSH, o que é melhor para meus propósitos. Obrigado!
Rich

8

Uma solução elegante, adquirida em dagit.o :

Crio ~/.ssh/rc

#!/bin/bash
if [ -S "$SSH_AUTH_SOCK" ]; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

adicionar à ~/.tmux.conf

set -g update-environment "DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"
set-environment -g 'SSH_AUTH_SOCK' ~/.ssh/ssh_auth_sock

7

No seu .tmux.confarquivo de configuração, adicione esta linha:

defina -g update-environment "SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION"

Isso faz com que essas variáveis ​​de ambiente sejam copiadas do shell principal para quaisquer shells abertos no tmux, o que permite que o ssh-agent funcione corretamente dentro desses shells do tmux.


2
Este é o método apropriado para obter esses valores em uma sessão tmux , mas todas essas variáveis ​​de ambiente já devem estar incluídas no valor padrão de update-environment. O OP deve verificar seu update-environmentvalor e, possivelmente, atualizar onde quer que esteja sendo alterado.
Chris Johnsen

1
Hm .. depois de procurar mais, eu concordo - as configurações listadas já estão nos padrões, e se eu executar o tmux sem um arquivo .tmux.conf, tudo funcionará corretamente. E se eu remover a linha que citei do meu arquivo .tmux.conf, isso funcionará para mim também, embora não tenha funcionado antes. Claramente, algo está errado de vez em quando. Talvez tenha a ver com suspender / restaurar ou anexar / desanexar ou sshing em uma sessão tmux remotamente. Vou manter meus olhos abertos e atualizados se encontrar o fator que o torna reprodutível.
Trevor Powell

update-environmentestá definido corretamente. No entanto, o problema ainda ocorre.
Rico

2
O problema é que a configuração só será reexecutada quando nenhum tmuxservidor estiver presente, desafiando o objetivo de reconectá-lo ... Talvez haja uma opção de linha de comando para atualizar novamente essas variáveis?
Tobias KIENZLER

3

Aconteceu-me que os painéis criados ao conectar via ssh no OS X começaram a pedir minha senha depois de um tempo trabalhando ok. Encontrei uma maneira de corrigir isso roubando essa linha de http://santini.di.unimi.it/extras/ph/my-tmux-setup.html

eval $(tmux show-environment -t [YOUR-SESSION] | grep '^SSH_AUTH_SOCK')

Basta executá-lo no painel que está reclamando.


2

Não tenho certeza se você está usando o bash ou outro shell, mas a instalação do tmux desse cara parece que funcionaria para o bash. Pessoalmente, estou usando o zsh com oh-my-zsh e descobri que o ssh-agent começou a trabalhar no tmux depois de adicionar

zstyle :omz:plugins:ssh-agent agent-forwarding on

no meu arquivo .zshrc e recarregou a configuração nas minhas sessões zsh em execução. Também achei a solução orientada a zsh desse cara , mas acabou sendo desnecessária para mim.


1

O que:

echo $SSH_AUTH_SOCK
echo $SSH_AGENT_PID
ssh-add -l

impressão?

Execute-o no seu terminal normal e execute-o dentro da sua tmuxsessão. Eles devem imprimir a mesma coisa.


Eu adicionei a resposta a esses comandos na pergunta. Eu também percebi que o problema também ocorre quando eu faço logon no ssh (sem usar o tmux) e editei a pergunta de acordo.
Rich

4
sshé fácil. Ative o encaminhamento do agente. A maneira mais fácil de fazer isso é executar em ssh -Avez de ssh. Use um alias para não precisar digitá-lo toda vez ou colocá-lo no seu .SSH/config.
Mikel

Legal, obrigado. Isso funcionou para o ssh. Alguma idéia de como corrigi-lo no tmux?
Rich

0

Existem muitas soluções, mas a mais simples é encontrada na resposta de Hans Ginzel, de 8 de janeiro de 2016, a uma pergunta relacionada ao StackOverflow de 27 de janeiro de 2014 . Basta adicionar o seguinte ao seu shell ~/.profileou similar:

alias ssh='eval $(tmux show-env -s | grep "^SSH_") && ssh'

Não há necessidade de definir funções de várias linhas ou criar novos arquivos temporários. Se você não quiser usar o alias ssh, basta alterá-lo para fixsshe remover && sshno final e executar fixsshsempre que estiver tentando executar a sshpartir de uma sessão tmux reassociada.

A resposta de Hans Ginzel sugere que é necessária uma 'versão mais recente' do tmux para executar show-env -s. Isso funciona para mim no tmux 2.7 e, na minha leitura do changelog , -sfoi adicionado em 3 de junho de 2008 pouco antes do lançamento do tmux 0.3. O tmux 2.3 (29 de setembro de 2016) está no Debian estável.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.