Come impedire che la password per decrittografare la chiave privata debba essere inserita ogni volta che si utilizza Git Bash su Windows?


125

Ho un servizio di costruzione automatica che scarica da un repository privato git. Il problema è che quando tenta di clonare un repository deve fornire la password, perché non viene ricordata; quindi poiché non esiste alcuna interazione umana, attende per sempre la password. Come posso forzarlo a ricordare da id_rsa.pub?

Risposte:


255

Per gli utenti Windows, basta notare che è così che ho impostato l'ambiente Git Bash per accedere una volta all'avvio. Modifico il mio ~/.bashrcfile:

eval `ssh-agent`
ssh-add

Quindi quando avvio Git Bash, sembra:

Welcome to Git (version 1.7.8-preview20111206)
(etc)
Agent pid 3376
Enter passphrase for /c/Users/starmonkey/.ssh/id_dsa:
Identity added: /c/Users/starmonkey/.ssh/id_dsa (/c/Users/starmonkey/.ssh/id_dsa)

E ora posso ssh su altri server senza accedere ogni volta.


9
Se non si dispone di un file ~ / .bashrc, è sufficiente creare un nuovo file di testo (blocco note o un altro editor) e aggiungere le due righe starmonkey menzionate.
pbz,

7
'~' si riferisce alla tua "directory home". In Windows, puoi trovarlo aprendo una shell dei comandi (cmd) e digitando "echo% USERPROFILE%".
Hawkeye Parker,

14
Per me questa sintassi non funziona. Ho dovuto scrivere eval $(ssh-agent)invece.
scontro il

1
Il mio problema era che dovevo specificare il file da usare per ssh-add. Probabilmente perché ne ho più di uno e non stavo usando il nome predefinito. Esempiossh-add ~/.ssh/myfile_rsa
errore di sintassi

1
copy > ~/.bashrcin git bash per creare il file bashrc in windows, ignora l'errore
Ruben,

61

Questa risposta spiega come salvare il nome utente e la password di GitHub in modo permanente, non la passphrase della chiave SSH.

In Windows, esegui

$ git config --global credential.helper wincred

Ciò significa che la prossima volta che spingi, inserirai il tuo nome utente e password come al solito, ma verranno salvati nelle credenziali di Windows. Dopo non dovrai più inserirli.

Come in, Push to GitHub senza inserire username e password ogni volta (Git Bash su Windows) .


2
dopo questo comando è necessario digitare il nome utente e la password.
Stephen Tun Aung,

5
Ciò riguarda le chiavi SSH o solo l'autenticazione HTTPS (nome utente e password)? La domanda sembra riguardare l'uso delle chiavi SSH.
Sean,

Ha funzionato perfettamente per me, suppongo che sto usando l'autenticazione HTTPS (nome utente e password).
Jonatan,

L'esecuzione di questo non ha prodotto alcun risultato.
user9993

@ user9993 Non lo farà. È una modifica della configurazione, quindi mentre non verrà effettuato alcun output, gitcambierà il suo comportamento in base alla direttiva di configurazione impostata.
starbeamrainbowlabs

9

Preferisco non dover digitare la mia passphrase SSH all'apertura di nuovi terminali; sfortunatamente la soluzione di starmonkey richiede che la password sia digitata per ogni sessione. Invece, ho questo nel mio .bash_profilefile:

# Note: ~/.ssh/environment should not be used, as it
#       already has a different purpose in SSH.

env=~/.ssh/agent.env

# Note: Don't bother checking SSH_AGENT_PID. It's not used
#       by SSH itself, and it might even be incorrect
#       (for example, when using agent-forwarding over SSH).

agent_is_running() {
    if [ "$SSH_AUTH_SOCK" ]; then
        # ssh-add returns:
        #   0 = agent running, has keys
        #   1 = agent running, no keys
        #   2 = agent not running
        ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]
    else
        false
    fi
}

agent_has_keys() {
    ssh-add -l >/dev/null 2>&1
}

agent_load_env() {
    . "$env" >/dev/null
}

agent_start() {
    (umask 077; ssh-agent >"$env")
    . "$env" >/dev/null
}

if ! agent_is_running; then
    agent_load_env
fi

# If your keys are not stored in ~/.ssh/id_rsa or ~/.ssh/id_dsa, you'll need
# to paste the proper path after ssh-add
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

unset env

Questo ricorderà la mia passphrase anche per le nuove sessioni terminali; Devo inserirlo solo una volta quando apro il mio primo terminale dopo l'avvio.

Vorrei accreditare dove ho preso questo; è una modifica del lavoro di qualcun altro, ma non ricordo da dove provenga. Grazie autore anonimo!

Aggiornamento 2019-07-01: non penso che tutto ciò sia necessario. Ora lavoro costantemente assicurandomi che il mio .bash_profilefile esegua ssh-agent:

eval $(ssh-agent)

Quindi ho impostato un sshfile di configurazione come questo:

touch ~/.ssh/config
chmod 600 ~/.ssh/config
echo 'AddKeysToAgent yes' >> ~/.ssh/config

Mi viene ancora chiesto il passphrase ogni volta.
Ryan,

1
@Ryan spero che l'aggiornamento che ho appena aggiunto risolverà il tuo problema. Tengo le informazioni aggiornate in un post di blog su conan.is/blogging/clojure-on-windows.html e ho posto la stessa domanda a stackoverflow.com/questions/52423626/…
Conan

Grazie, lo controllerò.
Ryan

@Conan La soluzione aggiornata funziona per sessione bash. Dopo aver chiuso la sessione bash in esecuzione e averne aperta una nuova, mi è stato nuovamente richiesto di inserire la password.
Tushar Raj,

5

Se capisco correttamente la domanda, stai già utilizzando una chiave SSH autorizzata nel servizio di compilazione, ma vuoi evitare di dover digitare la passphrase per ogni clone?

Posso pensare a due modi per farlo:

  1. Se il servizio di compilazione viene avviato in modo interattivo: prima di avviare il servizio di compilazione, iniziare ssh-agentcon un timeout sufficientemente lungo ( -topzione). Quindi utilizzare ssh-add(msysGit dovrebbe avere quelle) per aggiungere tutte le chiavi private necessarie prima di iniziare il servizio di compilazione. Dovresti comunque digitare tutte le passphrase, ma solo una volta per avvio del servizio.

  2. Se vuoi evitare di dover digitare le passphrase, puoi sempre rimuovere le passphrase dalle chiavi SSH, come descritto in /server/50775/how-do-i-change-my- passphrase chiave-privata , impostando una nuova passphrase vuota. Questo dovrebbe eliminare completamente la richiesta della password, ma è persino meno sicura dell'opzione precedente.


Grazie per la seconda opzione, ne avevo bisogno.
Stanislav Verjikovskiy il

1

Quando ho provato a spingere il mio codice, ho ricevuto l'errore di seguito:

$ git push origin dev

remote: Too many invalid password attempts. Try logging in through the website with your password.
fatal: unable to access 'https://naushadqamar-1@bitbucket.org/xxxx/xxxx-api.git/': The requested URL returned error: 403

Dopo alcune ore di ricerca, ho scoperto che devo usare il comando seguente:

$ git config --global credential.helper cache

Dopo aver eseguito il comando sopra, ho ricevuto la richiesta di inserire il mio nome utente e la mia password GitHub. Dopo aver fornito le credenziali corrette, sono in grado di inviare il mio codice.


Questo ha appena generato "git: 'credential-cache' non è un comando git." Comunque "git config --global credential.helper store" ha funzionato - questo potrebbe non essere il migliore, ma sono costretto a usare HTTPS piuttosto che il mio SSH preferito e voglio solo che funzioni.
Terry Brown,

0

La soluzione giusta è:

  1. Esegui il terminale predefinito di Windows - cmd e ottieni la directory del tuo profilo principale

    echo %USERPROFILE%
    
  2. Esegui Git Bash nella directory sopra e crea il .bashrcfile con il comando

    echo "" > .bashrc
    
  3. Apri il .bashrcfile con il tuo editor di testo preferito e incolla il codice dalla Guida di GitHub in quel file:

    env=~/.ssh/agent.env
    ...
    COPY WHOLE CODE FROM URL - I can't add it to Stack Overflow because it breaks layout... OMG!
    
  4. Riavvia Git Bash e ti chiede la password (solo la prima volta) e il gioco è fatto. Nessuna password che disturba di nuovo.


-1

È necessario creare il authorized_keysfile nella .sshcartella dell'utente in cui si intende connettersi al server del repository. Ad esempio, supponendo che tu usi il nome utente buildservicesu repo.serverpuoi eseguire:

cd ~buidservice
mkdir ./ssh
cat id_rsa.pub >> .ssh/authorized_keys

Quindi devi controllare le seguenti cose:

  1. Quella id_rsachiave privata corrispondente è presentata in builservice@build.server:~/.shh/id_rsa.

  2. Quell'impronta digitale di repo.server è memorizzata nel buildservice@build.server:~/.ssh/known_hostsfile. In genere ciò avverrà dopo il primo tentativo di sshconnessione a repo.server.


Ho dimenticato di dire. Sotto Windows la tua home directory probabilmente sarebbe C: \ Users \ Username
beduin

5
Mmm .. Git bash ha tutto, leggi più attentamente il titolo della domanda. Anche dalla domanda ho assunto che la coppia di chiavi sia già stata generata (perché è stato chiesto come forzare il server repo a ricordare id_rsa.pub). Ci scusiamo per la formattazione.
beduino

1
Ok, non ho mai sentito parlare di "git bash" prima d'ora. Sorry 'bout che
sehe

Suppongo che questo stia usando msysgit. Sto aggiungendo il tag.
Adam Dymitruk,

3
Avvertimento! L'uso cat id_rsa.pub > .ssh/authorized_keyssovrascriverà tutte le chiavi autorizzate esistenti. Utilizzare >>per aggiungere anziché sovrascrivere.
David Pärsson,
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.