Como evitar que a senha seja solicitada toda vez que eu envio para o Bitbucket

217

Configurei meu material ssh com a ajuda deste guia e ele funcionava bem (eu poderia executar hg pushsem precisar de uma senha). O que poderia ter acontecido entre então e agora, considerando que ainda estou usando o mesmo diretório inicial.

$ cat .hg/hgrc 
[paths]
default = ssh://[email protected]/tshepang/bloog

$ hg push
Enter passphrase for key '/home/wena/.ssh/id_rsa': 
pushing to ssh://[email protected]/tshepang/bloog
searching for changes
...
tshepang
fonte

Respostas:

337

Você precisa usar um agente ssh. Resposta curta: tente

$ ssh-add

antes de empurrar. Forneça sua senha quando solicitado.

Se você ainda não está executando um agente ssh, receberá a seguinte mensagem:

Could not open a connection to your authentication agent.

Nessa situação, você pode iniciar um e configurar seu ambiente assim

eval $(ssh-agent)

Então repita o ssh-addcomando.

Vale a pena dar uma olhada na página de manual do agente ssh .

jmtd
fonte
2
Qual é o objetivo de evalvocê apenas digitar ssh-agent?
James McMahon
4
Ele exibe alguns comandos que permitem usá-lo e não os executa para você; evalfaz a extração.
21418 tshepang
Não está relacionado à pergunta original, mas se você continuar com esses problemas no GitHub, Bitbucket etc., verifique se está usando a URL do git / ssh, não o http, que continuará pedindo nome de usuário + senha.
Czechnology
E se você não tem uma chave padrão ou deseja adicionar múltiplos,ssh-add /path/to/key
hoosierEE
46

Uma maneira de resolver isso é com ssh-agente ssh-add:

$ exec ssh-agent bash
$ ssh-add
Enter passphrase for ~/.ssh/id_rsa: 

Depois disso, a senha é salva para a sessão atual. e não será solicitado novamente.

Stefano
fonte
7
A maioria das pessoas não quer ser incomodada por suas frases secretas.
connexo
26

Eu uso o Keychain para gerenciar chaves ssh. Ele também está disponível no Debian e, provavelmente, no Ubuntu com

apt-get install keychain

Aqui está a página do pacote de chaves do Debian . Como você pode ver, o projeto não é muito ativo, mas funciona para mim. Também comentei um pouco sobre isso em outra resposta aqui

Faheem Mitha
fonte
2
//, isso funcionou para mim. É muito melhor que o ssh-agent, já que não preciso digitar minha senha de chave ssh toda vez que abro um terminal .
Nathan Basanese
@NathanBasane, você está dizendo que, usando chaveiro, não é necessário digitar a senha da chave ssh toda vez que você abre um terminal? Como você configura isso? porque o chaveiro continua pedindo a senha toda vez que abro o terminal, somente a primeira vez que o abro após a inicialização, mas ainda assim. Não quero inserir a senha sempre.
M4l490n
@ m4l490n Não, se você estiver usando chaveiro, não precisará digitar a senha da chave ssh toda vez que abrir um terminal. Mas você precisa inseri-lo uma vez após a inicialização. A senha não é salva no disco - isso seria inseguro.
Faheem Mitha 01/01
Para mim, ele pergunta toda vez que faço login (tenho um repositório git + chaves ssh em um servidor remoto e toda vez que faço um "git pull" preciso digitar a senha))
Martin Thoma
@MartinThoma Isso parece errado. Verifique se você configurou o .ssh corretamente. Em particular, seu shell está configurado corretamente? Se ainda não está funcionando para você e você não consegue descobrir, você pode fazer uma pergunta.
Faheem Mitha
13

Crie (ou edite, se existir) o seguinte arquivo ~ / .ssh / config:

Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa
ness-EE
fonte
Mas eu estou usando um par diferente de chaves para cada serviço ...
connexo
@connexo você pode substituir o curinga asterisco com seu nome host individual e 'id_rsa' com o seu correspondente chave privada
ness-EE
1
Eu precisava adicionar IgnoreUnknown AddKeysToAgent,UseKeychainlogo acima UseKeychain yes.
consideRatio
1
Estou recebendo este erro: "Opção de configuração incorreta: usekeychain" na linha "UseKeychain yes".
M4l490n
@ m4l490n: parece que a UseKeychainopção foi adicionada no OpenSSH 7.1p2 (28-02-2016). Talvez você tenha uma versão anterior. openssh.com/txt/release-7.2
chus
6

Por conveniência, o método ideal é uma combinação das respostas de jmtd e Faheem .

Usar ssh-agentsozinho significa que uma nova instância de ssh-agentprecisa ser criada para cada novo terminal que você abrir. keychainquando inicializado, solicitará a senha da (s) chave (s) privada (s) e a armazenará. Dessa forma, sua chave privada é protegida por senha, mas você não precisará digitar sua senha repetidamente.

O wiki do Arch recomenda inicializar as chaves do /etc/profile.d/seu perfil de shell, como .bash_profileou .bashrc. Isso tem uma desvantagem, pois inicializa seu chaveiro assim que você abre um terminal.

Uma abordagem mais flexível é combinar keychaincom uma tmuxsessão específica . Então, em .bash_profile:

tsess=$(tmux ls 2>&1)

if [[ "${tsess%%:*}" = "secured" ]] && 
   [[ -f $HOME/.keychain/$HOSTNAME-sh ]]; then
    # start keychain
    /usr/bin/keychain -Q -q --nogui ~/.ssh/id_rsa
    . $HOME/.keychain/$HOSTNAME-sh
fi

... e, em seguida, é apenas um caso de iniciar a tmuxsessão protegida como e quando necessário (iniciado a partir de um keybind):

#!/bin/bash
PID=$(pgrep tmux)
new="tmux -f $HOME/.tmux/conf new -s secured"
old="tmux attach -t secured -d"

if [[ -z "$SSH_AUTH_SOCK" ]]; then
    eval `ssh-agent`
    trap "kill $SSH_AGENT_PID" 0
fi

if [[ -z "$PID" ]]; then
    urxvtc -title "SSH" -e sh -c "${new}"
else
    urxvtc -title "SSH" -e sh -c "${old}"
fi

ssh-add

Agora, seu chaveiro será inicializado apenas uma vez quando você iniciar essa tmuxsessão específica . Enquanto essa sessão persistir, você poderá acessar essas sshchaves e enviar para seus repositórios remotos.

jasonwryan
fonte
Como eu faria isso funcionar em uma máquina remota? Modifiquei o segundo script para procurar por $ SSH_CLIENT e, se existir, não execute o urxvtc, apenas o tmux. Isso funciona, mas o problema é a parte .bash_profile. Quando eu entrei pela primeira vez na caixa, ele dizia "servidor não encontrado: conexão recusada", que é a saída de "tmux ls". Então, quando executo o segundo script, o tmux inicia uma nova sessão ou anexa a uma existente, mas não há prompt de chaveiro. Então, quando eu sair da sessão, o prompt do chaveiro estará lá esperando.
21412 jonyamo
Atualizei a resposta para silenciar a saída do tmux, se não houver sessão.
jasonwryan
Obrigado, mas isso ainda não resolveu o problema com o chaveiro. O tmux cria a nova sessão, mas vai direto para qualquer prompt vazio. Somente quando saio da sessão do tmux é que vejo o prompt do chaveiro solicitando minha senha.
jonyamo
Acho que devo parar de dizer chaveiro, já que o chaveiro é executado apenas em .bash_profile. O problema é da execução do ssh-add. Embora, se eu executar o ssh-add manualmente após criar a sessão tmux, ele funcione.
21132 jonyamo
1
Pule o segundo script e inicie sua sessão segura do tmux .profile- assim você receberá as chaves assim que fizer o login.
jasonwryan
0

Você pode usar sshpass:

$ sudo apt-get install sshpass
$ sshpass -p 'password' ssh username@server

Você só precisa adicionar sshpass -p yourpassphraseantes de anexar seu sshcomando usual .

Belka
fonte
2
Parece uma ideia realmente estúpida. Isso não faria sua senha aparecer em texto não criptografado no seu histórico de shell?
connexo
Exatamente, mas você também não deve proteger sua sessão com uma senha?
Belka
1
Mesmo que sim, com que frequência você tem um colega sentado ao seu lado e ajudando / aprendendo com você?
connexo