Existe uma maneira de manter a conectividade do agente ssh em telas diferentes?

2

Sempre que eu uso o ssh-agent para logins sem senha, ele não funciona em logins e sessões de tela diferentes, mesmo que sejam concorrentes.

Eu suspeito que ele usa algumas variáveis de shell que não funcionam em sessões diferentes. Existe alguma maneira de configurá-lo ou usá-lo em algum tipo de variável que possa estar presente em todas as sessões?

    
por vfclists 07.05.2013 / 22:50

4 respostas

2

Eu uso keychain para gerenciar minhas variáveis de ambiente ssh-agent , e lida com a certeza de que apenas um agente está sendo executado por vez. Do meu .bashrc em máquinas apropriadas:

# is this an interactive shell?
if [[ $- == *i* ]]; then
    # set up ssh key server
    if [[ -x /usr/bin/keychain ]]; then
        eval $(keychain --eval --ignore-missing the <keys I want>)
    fi
fi

Ele armazena as variáveis de ambiente em ~/.keychain , executa o agente se ele não for encontrado e retorna as variáveis novas ou existentes para o eval . Eu configurei isso há alguns anos e não toquei nele. Se você tiver ssh-askpass instalado, ele poderá solicitar a senha em um ambiente X11 mesmo quando o shell que estiver executando o keychain não estiver visível (como os scripts init X11).

Existem outras maneiras de usá-lo, mas isso funciona para mim em várias estações de trabalho Linux, incluindo o login em uma estação de trabalho a partir do remoto, quando não estou conectado ao X11.

    
por 08.05.2013 / 00:05
2

Sim, o ssh usa a variável SSH_AUTH_SOCK para acessar o agente.

Se você iniciar diferentes agentes em sessões diferentes, eles não compartilharão as chaves.

Execute ssh-agent para ver as variáveis configuradas por esta instância.

Leia man ssh-agent para descobrir as possíveis opções. (Especialmente -a deve ser útil no seu caso.)

A melhor maneira de compartilhar um agente depende da sua situação. Você precisa garantir que apenas um agente esteja em execução e que todas as suas sessões tenham o ambiente configurado para usá-lo.

Se você estiver usando algum ambiente de área de trabalho, geralmente ele inicia um agente ssh e define o ambiente para torná-lo disponível para todos os processos iniciados dentro da sessão da área de trabalho. - Se você quiser compartilhar um novo agente para todas as suas screen sessões, poderá iniciar a tela como ssh-agent screen . - Se você quiser ssh dentro da caixa e acessar seu agente, isso também é possível, mas você está por conta própria.

    
por 07.05.2013 / 23:43
2

Você pode criar um script para o processo de login de todos que

  1. verifica se pelo menos uma instância do agente ssh está em execução (para este usuário)
  2. seleciona a instância a ser usada (a mais antiga)
  3. verifica se as informações do soquete para esse processo estão disponíveis (e corretas)
  4. em caso de sucesso, leva essa informação em seu próprio ambiente
  5. e talvez mate as outras instâncias (pelo menos a sua própria, se houver)
ps -o pid,etime,args --no-headers --sort=start_time \
  -p $(pgrep --uid $USER ssh-agent) | 
    awk '{print $1; exit;}'

fornece o PID da instância mais antiga do agente ssh. Isso seria mais fácil com pgrep --uid $USER --oldest ssh-agent , mas dessa forma você obtém facilmente os PIDs das outras instâncias também.

Você pode escrever $SSH_AUTH_SOCK em um arquivo ~/.ssh/env/$PID (se $SSH_AGENT_PID do processo atual for igual a $ PID):

echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK" > ~/.ssh/env/$PID

Outras sessões podem verificar se o arquivo existe e ainda é válido e importá-lo:

bash -c 'test -e ~/.ssh/env/$PID || exit 1;
  . ~/.ssh/env/$PID; test -e $SSH_AUTH_SOCK' && . ~/.ssh/env/$PID
    
por 08.05.2013 / 00:26
0

Use o excelente ssh-ident que suporta várias identidades para segurança adicional.

É um wrapper de inserção para ssh , scp :

ln -s /usr/bin/ssh-ident ~/bin/ssh
ln -s /usr/bin/ssh-ident ~/bin/scp

Há uma grande variedade de respostas "roll-your-own" , mas por que reinventar a roda?

    
por 24.11.2016 / 07:00