como evitar ser perguntado "Digite a senha da chave" quando estou executando uma operação ssh em um host remoto?

44

Eu sou ssh em um host remoto (linux, fedora) e quero fazer a operação ssh (git com bitbucket) lá. Há ssh-agent em execução nessa máquina,

$ ps -e|grep sh-agent
 2203 ?        00:00:00 ssh-agent

mas quando eu quero ir embora, é necessário que eu digite a senha

$ git pull
Enter passphrase for key '/user/wgong/home/.ssh/id_rsa': 

Nota: se eu operar nessa máquina localmente, ele não solicitará que eu digite a senha

lírio
fonte
1
Eu nunca usei isso, mas não há um comando ssh-add que eu acho que é usado para esse tipo de coisa
barlop

Respostas:

81

Na minha opinião, a melhor maneira de usar ssh

Antes de usar o Git, adicione sua chave ao ssh-agent

Inicie o ssh-agent se não for iniciado:

$ eval `ssh-agent -s`

Adicione sua chave privada usando ssh-add

$ ssh-add ~ / .ssh / id_rsa_key
Digite a senha para /home/user/.ssh/id_rsa_key:
Identidade adicionada: /home/user/.ssh/id_rsa_key
(/home/user/.ssh/id_rsa_key)

Verifique se a chave foi adicionada (o parâmetro é um L minúsculo):

$ ssh-add -l
2048 55: 96: 1a: b1: 31: f6: f0: 6f: d8: a7: 49: 1a: e5: 4c: 94: 6f
/home/user/.ssh/id_rsa_key (RSA)

Tente se conectar ao seu servidor Git:

$ ssh git.example.com

Agora você pode usar o Git sem avisos adicionais de senha.

Outras maneiras

https://unix.stackexchange.com/questions/90853/how-can-i-run-ssh-add-automatically-without-password-prompt

romano
fonte
mas eu usei o Git adicione sua chave ao ssh-agent, então como fazer? obrigado
lily
@ Lily Desculpe, não entendi sua pergunta.
Roman
1
Esta é a solução que funcionou para mim.
Skatox 23/09/16
2
Como eu faço isso persistente? Basta colocá-lo em .bashrc?
oarfish
1
Para sua informação, evalé necessário porque gera comandos que exportam variáveis ​​de ambiente como SSH_AUTH_SOCK necessárias. unix.stackexchange.com/questions/351725/…
wisbucky
21

Se você já estiver ssh-agentexecutando, poderá adicionar a chave e precisará digitar a senha uma vez e apenas uma vez para essa sessão.

ssh-add ~/.ssh/id_rsa

Você não diz qual sistema operacional está usando, mas se for Linux e Gnome, o aplicativo "Senhas e Chaves" (nome da CLI:) seahorsepoderá gerenciar esses itens para que sejam desbloqueados quando você efetuar login (não é necessária uma senha) . Outros ambientes de desktop Linux têm seus próprios gerentes. Não sei o que outros sistemas operacionais fazem aqui.

ams
fonte
3

O principal motivo da solicitação de senha é que sua chave está criptografada; compare estes dois:

  • não criptografado

    $ head ~/.ssh/id_rsa 
    -----BEGIN RSA PRIVATE KEY-----            
    AIIAogIBAAKCAQEAtOJQ0Z3ZbyzuknnHqn5oMCmNf8zGmERhW+g5Eftf9daZ5qvZ
    
  • criptografado

    $ head ~/.ssh/id_rsa 
    -----BEGIN RSA PRIVATE KEY-----    
    Proc-Type: 4,ENCRYPTED
    DEK-Info: AES-128-CBC,A95215C9E9FE00B8D73C58BE005DAD82
    
    ZAzLq/LbHSfOVkXtQz6M6U8yuAx2lIu9bH/k7ksgat92IDjZntRrT1XMpkYtjB+0
    

Então você deve fazer um dos seguintes:

  1. Se estiver criptografado, você pode tentar remover a criptografia .
  2. Você está usando a chave errada. Se você deseja usar uma chave diferente, especifique outro arquivo ou edite seu ~/.ssh/confige especifique um arquivo de identidade diferente ( IdentityFile).
  3. Corra ssh-add -lpara listar todas as suas identidades (depois compare com o seu local) e verifique com o Stash se você estiver usando as teclas certas (elas existem na configuração do Stash).
  4. Se você conhece a senha e deseja automatizá-la, tente a seguinte solução alternativa:

    PS="my_passphrase"
    install -vm700 <(echo "echo $PS") $PWD/my_pass
    DISPLAY= SSH_ASKPASS=$PWD/my_pass ssh-add - && rm -v my_pass
    

Solução de problemas:

  1. Verifique novamente se o seu agente SSH está executando ( eval "$(ssh-agent -s)").
  2. Execute novamente o git via: GIT_TRACE=1 git pullou com GIT_SSH_COMMAND="ssh -vv"(Git 2.3.0+) para depurar seu comando novamente.
  3. Você pode tentar ignorar a solicitação da senha (que a redirecionará para true), mas acho que não vai ajudar. Se pedir, há uma razão para isso e é basicamente necessária.

    DISPLAY= SSH_ASKPASS=/bin/true ssh-add
    
kenorb
fonte
2

O ssh-addprograma inicia um agente que pode reter (e fornecer) sua senha. A maneira de usá-lo remotamente é um pai do seu shell interativo (para que o agente não pare).

Aqui estão algumas perguntas relacionadas:

Agora ... conectando-se remotamente , como regra, seu comando não efetua login como tal, portanto, não é iniciado ssh-add. Você pode contornar isso executando um script que

  • começa ssh-agent
  • começa ssh-add
  • adiciona sua chave
  • executa o comando que você deseja.

O ponto fraco é o segundo passo: você ainda será solicitado a inserir a senha, a menos que diminua sua segurança usando uma chave que não possui senha . Algumas pessoas fazem isso, a maioria das pessoas desaconselha.

Thomas Dickey
fonte
ssh-addnão inicia o agente. Ele se conecta a um agente já em execução.
2121
Obrigado - estou acostumado a fazer isso em scripts separados e esqueci a parte que faltava.
21415 Thomas Thomas Dickey
0

Você pode remover facilmente a senha da sua chave usando o seguinte comando

ssh-keygen -p

No primeiro prompt, digite o caminho do arquivo (ou pressione Enter para alterar o padrão). Segundo prompt, digite a senha antiga.

Parece que esta é a maneira mais fácil!

Justin Samuel
fonte
0

Você ainda receberá um prompt de senha para descriptografar a chave privada, mesmo que ela seja carregadassh-agent até que a chave pública SSH correspondente seja adicionada ao controle remoto ~/.ssh/authorized_keys.

Reproduzir:

# We are about to ssh to localhost, therefore, unauthorized everyone.
$ rm ~/.ssh/authorized_keys

$ eval $(ssh-agent)
# Agent pid 9290

$ ssh-add
# Enter passphrase for /home/uvsmtid/.ssh/id_rsa: 
# Identity added: /home/uvsmtid/.ssh/id_rsa (/home/uvsmtid/.ssh/id_rsa)

$ ssh localhost
# Enter passphrase for key '/home/uvsmtid/.ssh/id_rsa':
# uvsmtid@localhost's password:
  # NOTE: See password prompt for private key
  #       (and only then prompt for remote login).
  #       Why? Isn't the private key is already loaded by `ssh-add`?

$ ssh-copy-id localhost
$ ssh localhost
  # NOTE: No password for private key anymore.
  #       The key is served by `ssh-agent`.

Confuso o suficiente. A senha de login SSH remota seria suficiente nesse caso.

Posso especular que isso evite adicionar sua chave pública (que está emparelhada com a chave privada criptografada) sem saber a senha de criptografia da chave privada correspondente. É um procedimento de login único por controle remoto de qualquer maneira.

uvsmtid
fonte