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.