Come evitare di ricevere la passphrase ogni volta che invio a Bitbucket


217

Ho impostato la mia roba ssh con l'aiuto di questa guida e funzionava bene (potevo correre hg pushsenza che mi venisse chiesta una passphrase). Cosa sarebbe potuto succedere tra allora e adesso, considerando che sto ancora usando la stessa directory home.

$ cat .hg/hgrc 
[paths]
default = ssh://hg@bitbucket.org/tshepang/bloog

$ hg push
Enter passphrase for key '/home/wena/.ssh/id_rsa': 
pushing to ssh://hg@bitbucket.org/tshepang/bloog
searching for changes
...

Risposte:


337

Devi usare un agente ssh. Risposta breve: prova

$ ssh-add

prima di spingere. Fornire la passphrase quando richiesto.

Se non stai già eseguendo un agente ssh riceverai il seguente messaggio:

Could not open a connection to your authentication agent.

In quella situazione, puoi avviarne uno e configurare il tuo ambiente in questo modo

eval $(ssh-agent)

Quindi ripetere il ssh-addcomando.

Vale la pena dare un'occhiata alla manpage dell'agente ssh .


2
Qual è il punto di cui evalpotresti semplicemente digitare ssh-agent?
James McMahon,

4
Visualizza alcuni comandi che ti consentono di usarlo e non li esegue per te; evalfa l'escissione.
Tshepang,

Non correlato alla domanda originale ma se continui a riscontrare questi problemi su GitHub, Bitbucket ecc., Assicurati di utilizzare l'URL git / ssh, non http, che continuerà a richiedere nome utente + password.
Czechnology,

E se non si dispone di una chiave predefinita o si desidera aggiungere multipli,ssh-add /path/to/key
hoosierEE,

46

Un modo per risolvere questo è con ssh-agente ssh-add:

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

Successivamente, la passphrase viene salvata per la sessione corrente. e non verrà più chiesto.


7
La maggior parte delle persone non vuole affatto essere disturbata per le loro passphrase.
connexo,

26

Uso Keychain per gestire chiavi ssh. È anche disponibile in Debian e quindi presumibilmente con Ubuntu

apt-get install keychain

Ecco la pagina del pacchetto portachiavi Debian . Come puoi vedere, il progetto non è molto attivo, ma funziona per me. Ho anche commentato un po 'questo in un'altra risposta qui


2
//, Questo ha funzionato per me. È molto meglio di ssh-agent, poiché non ho bisogno di inserire la password della mia chiave ssh ogni volta che apro un terminale .
Nathan Basanese,

@NathanBasane stai dicendo che usando il portachiavi non devi inserire la password della chiave ssh ogni volta che apri un terminale? Come lo configuri? perché il portachiavi continua a chiedere la password ogni volta che apro il terminale, solo la prima volta che lo apro dopo l'avvio, ma comunque. Non voglio inserire la passphrase ogni volta.
m4l490n,

@ m4l490n No, se si utilizza il portachiavi, non è necessario immettere la password della chiave ssh ogni volta che si apre un terminale. Ma è necessario inserirlo una volta dopo l'avvio. La passphrase non viene salvata sul disco, ciò non sarebbe sicuro.
Faheem Mitha,

Per me, mi chiede ogni volta che eseguo l'accesso (ho un repository git + chiavi ssh in un server remoto e ogni volta che faccio un "git pull" ho bisogno di inserire la passphrase)
Martin Thoma

@MartinThoma Sembra sbagliato. Verifica di aver configurato correttamente .ssh. In particolare, la shell è configurata correttamente? Se non funziona ancora per te e non riesci a capirlo, potresti fare una domanda.
Faheem Mitha,

13

Crea (o modifica se esiste) il seguente file ~ / .ssh / config:

Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa

Ma sto usando una coppia diversa di chiavi per ogni servizio ...
connexo

@connexo puoi sostituire l'asterisco jolly con il tuo nome host individuale e 'id_rsa' con la tua chiave privata corrispondente
ness-EE

1
Ho dovuto aggiungere IgnoreUnknown AddKeysToAgent,UseKeychainappena sopra UseKeychain yes.
conside Ratio

1
Ricevo questo errore: "Opzione di configurazione errata: usekeychain" sulla riga "UseKeychain yes".
m4l490n,

@ m4l490n: sembra che l' UseKeychainopzione sia stata aggiunta in OpenSSH 7.1p2 (28-02-2016). Forse hai una versione precedente. openssh.com/txt/release-7.2
chus

6

Per comodità, il metodo ottimale è una combinazione delle risposte di jmtd e Faheem .

L'uso da ssh-agentsolo significa che è ssh-agentnecessario creare una nuova istanza di per ogni nuovo terminale che si apre. keychainuna volta inizializzato, richiederà la passphrase per le chiavi private e la memorizzerà. In questo modo la tua chiave privata è protetta da password ma non dovrai inserire più volte la password.

La wiki di Arch consiglia di inizializzare il portachiavi da /etc/profile.d/o il profilo della shell, come .bash_profileo .bashrc. Questo ha uno svantaggio in quanto inizializza il tuo portachiavi non appena apri un terminale.

Un approccio più flessibile è quello di combinare keychaincon una tmuxsessione specifica . Quindi, in .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 poi si tratta solo di avviare la tmuxsessione protetta come e quando richiesto (avviato da un 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

Ora, il tuo portachiavi verrà inizializzato solo una volta quando avvii quella tmuxsessione specifica . Finché la sessione persiste, sarai in grado di accedere a tali sshchiavi e inviare ai tuoi repository remoti.


Come potrei farlo funzionare su una macchina remota? Ho modificato il secondo script per controllare $ SSH_CLIENT e se esiste non eseguire urxvtc, solo tmux. Funziona, ma il problema è la parte .bash_profile. Quando accedo per la prima volta alla casella, dice "server non trovato: connessione rifiutata" che è l'output di "tmux ls". Quindi, quando eseguo il secondo script, tmux avvia una nuova sessione o si collega a una esistente, ma non è disponibile alcun prompt di portachiavi. Quindi, quando esco dalla sessione, il prompt del portachiavi è lì in attesa.
jonyamo,

Ho aggiornato la risposta al silenzio tmux se non c'è sessione.
Jasonwryan,

Grazie, ma questo non ha ancora risolto il problema con il portachiavi. tmux crea la nuova sessione ma passa direttamente a qualsiasi prompt vuoto. Solo quando esco dalla sessione di tmux vedo il prompt del portachiavi che richiede la mia passphrase.
jonyamo,

Immagino che dovrei smettere di dire portachiavi, poiché il portachiavi viene eseguito solo in .bash_profile. Il problema deriva dall'esecuzione di ssh-add. Tuttavia, se eseguo ssh-add manualmente dopo aver creato la sessione tmux, funziona.
jonyamo,

1
Salta il secondo script e avvia semplicemente la tua sessione tmux protetta .profile: in questo modo riceverai la richiesta di chiavi non appena accedi.
Jasonwryan,

0

Puoi usare sshpass:

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

Devi solo aggiungere sshpass -p yourpassphraseprima di aggiungere il tuo solito sshcomando.


2
Sembra un'idea davvero stupida. Non renderebbe la tua password mostrata in chiaro nella cronologia della shell?
connexo,

Esatto, ma non dovresti proteggere anche la tua sessione con una password?
belka,

1
Anche se lo fai, con quale frequenza hai un collega seduto accanto a te che ti aiuta / impara da te?
connexo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.