Por que o ssh-agent não salva minha chave não criptografada para uso posterior?

12

Toda vez que eu SSH em outro servidor do nosso servidor Ubuntu sem cabeça, sou solicitada a senha do meu arquivo de chave. Mesmo se eu já tiver conectado ao servidor.

Você tem alguma idéia de por que isso talvez? Pode ser algo tão simples quanto ssh-agentnão estar em execução no momento ou algo assim.

A mesma chave no meu desktop Ubuntu Gnome está funcionando bem. O servidor e a área de trabalho estão executando o Ubuntu 10.10.

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent
Treffynnon
fonte
1
Primeiro, como você disse, verifique se ssh-agentestá em execução:ps -ef | grep '[s]sh-agent'
Scott Severance
@mssever Sim, parece ser. Veja a pergunta atualizada.
precisa saber é o seguinte

Respostas:

10

Mesmo se o agente estiver ativo, se determinadas variáveis ​​de ambiente não estiverem definidas, você não terá referência ao agente. Além disso, mesmo que esteja tudo bem, agente e variáveis, a identidade não é enviada automaticamente para o agente: isso é uma tarefa para ssh-askpasstrabalhar apenas em sessões X.

Se você estiver usando o bash, crie o arquivo ~/.bash_profilecom este conteúdo:

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"
}
export -f ssh

# another example: git
git() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"
}
export -f git

modifique o nome do arquivo de ~/.ssh/id_dsaacordo com suas necessidades e adicione esta linha a~/.bash_logout

# stuff to add at end of ~/.bash_logout
if ((agent_started)); then
  echo "Killing ssh agent"
  ssh-agent -k
fi

Uma última observação: isso não interfere em uma sessão do gnome, porque, nesse caso, ~/.profileé apenas originário, e você pode se beneficiar da ssh-askpassinterface gráfica que solicita uma senha e a envia para ssh-agent.

enzotib
fonte
Obrigado @enzotib, funciona muito bem sshem outras máquinas. Mas isso não ocorre quando você usa gitpara empurrar ou puxar um repositório público. Você tem alguma idéia de como eu poderia resolver isso também?
precisa saber é o seguinte
Adicione uma função idêntica a ssh(), chame-a git()e altere a última linha de /usr/bin/sshpara /usr/bin/git. Além disso, adicione uma linha final com export -f git.
enzotib
@enzotib Eu tentei isso, mas agora quando entro sshna máquina com o bash_profilearquivo que você criou acima da instalação, ele me pede a senha da chave. Por alguma razão agora, toda vez que eu escrevo, pergunta antes mesmo de executar sshou git. Consulte gist.github.com/942082 para obter o prompt de retorno ao efetuar login na máquina ofensiva.
precisa saber é o seguinte
@ Treffynnon: Eu não sei exatamente como gitinteragir com ssh, e eu não uso gitpara que eu não possa tentar. Modifiquei o ~/.bash_profilepara incluir a git()função que mencionei acima, para ter certeza de que minha explicação anterior era clara. Além disso, parece que na saída você mostra que modificou a máquina servidor, mas todos os meus conselhos foram direcionados apenas à máquina cliente.
enzotib
@enzotib Isso está correto. O servidor no qual efetuo logon se torna meu cliente quando gitenvio por push para um forja / repositório central, para que o arquivo esteja no lugar certo. Eu acho que você acabou de me dar a dica / movimentou meus pensamentos. Eu tenho um prompt especial do bash que exibe o ramo git do arquivo pwd. Aposto que é isso que está acionando a solicitação de senha no login do bash, pois ele tenta git stat antes de renderizar o prompt do bash!
precisa saber é o seguinte
2

Recentemente, comecei a usar o ssh-ident:

https://github.com/ccontavalli/ssh-ident

tudo o que você precisa fazer é adicionar algo como:

alias ssh="/path/to/ssh-ident"

no seu .bashrc. Como alternativa, você pode ln -s /path/to/ssh-ident ~/bin/sshou algum outro diretório em seu PATH antes /bine /usr/bin.

rabexc
fonte