Perché git non ricordo la mia passphrase su Windows


144

Ho appena iniziato a usare git e non riesco a ricordare che la mia passphrase sto usando cmd.exe elevato e il mio host git è github e ho creato una chiave ssh come quella guida su github

ma ho ancora

*\subnus.mvc>git push origin master
Enter passphrase for key '/c/Users/Subnus/.ssh/id_rsa':

Non ho usato msysgit da solo, ma l' agente di autenticazione del concorso potrebbe essere utile.
Cebjyre,

1
Ho provato di tutto e poi ho trovato questo che ha funzionato.
Blake Niemyjski,

1
Windows 10 viene fornito con OpenSSH da qualche tempo. Abilitare il servizio ssh-agent, usare ssh-add per aggiungere la chiave all'archivio ssh e impostarlo GIT_SSHnel proprio ambiente (se necessario) e git / ssh ricorderà la passphrase tramite ssh-agent. Vedi la mia risposta di seguito per istruzioni più dettagliate.
d3r3kk,

1
2019, ho appena installato git su Windows 10 e git richiede una volta la password e la ricorda.
Jean-François Fabre

@ Jean-FrançoisFabre Potresti non utilizzare OpenSSL.
RoadRunner,

Risposte:


206

Mi rendo conto che questa domanda sta arrivando a due anni, ma ho avuto lo stesso problema e diverse risposte qui non hanno risposto completamente alla domanda per me. Ecco due soluzioni passo-passo, a seconda che tu usi TortoiseGit oltre a msysgit o meno.

La prima soluzione presuppone Windows, msysgit e PuTTY.

  1. Installa msysgit e PuTTY come indicato.
  2. (Facoltativo) Aggiungi PuTTY al tuo percorso. (Se non lo fai, allora qualsiasi riferimento ai comandi PuTTY di seguito deve essere preceduto dal prefisso completo dell'eseguibile appropriato.)
  3. Se non lo hai già fatto, genera un hash chiave come indicato su GitHub o come indicato dal tuo host Git.
  4. Ancora una volta, se non l'hai già fatto, converti la tua chiave per usarla con pageant.exe di PuTTY usando puttygen.exe . Le istruzioni sono nella documentazione di PuTTY, in questa guida utile e in molti altri luoghi nel cyberspazio.
  5. Esegui pageant.exe di PuTTY , aprire il file .ppk ("Aggiungi chiave") e fornire la passphrase per la chiave.
  6. Accedi alla finestra di dialogo delle variabili di ambiente di Windows (fai clic con il pulsante destro del mouse su "Computer", fai clic su "Proprietà", fai clic su "Impostazioni di sistema avanzate" o sulla scheda "Avanzate", fai clic su "Variabili di ambiente"). Aggiungi la seguente variabile d'ambiente:

    GIT_SSH = C: \ piena \ percorso \ a \ plink.exe

    Sostituisci "C: \ full \ path \ to" con il percorso di installazione completo su PuTTY, dove si trova plink.exe. Probabilmente è meglio aggiungerlo alla sezione "Variabili utente". Inoltre, assicurarsi che il percorso utilizzato per plink.exe corrisponda al percorso utilizzato per Pageant (pageant.exe). In alcuni casi potresti avere diverse installazioni di PuTTY perché potrebbe essere installato insieme ad altre applicazioni. L'uso di plink.exe da un'installazione e pageant.exe da un'altra probabilmente causeranno problemi.

  7. Apri un prompt dei comandi.

  8. Se si sta tentando di connettersi a un repository git ospitato su Github.com, eseguire il comando seguente:

    plink.exe git@github.com

    Se il repository git a cui si sta tentando di connettersi è ospitato da qualche altra parte, sostituire git@github.com con un nome utente e un URL appropriati. (Supponendo Github) Dovresti essere informato che la chiave host del server non è memorizzata nella cache e ti viene chiesto se ti fidi. Rispondi con una y . Ciò aggiungerà la chiave host del server all'elenco di host noti di PuTTY. Senza questo passaggio i comandi git non funzioneranno correttamente. Dopo aver premuto Invio, Github ti informa che Github non fornisce l'accesso alla shell. Va bene ... non ne abbiamo bisogno. (Se ti stai connettendo a qualche altro host e ti dà accesso alla shell, probabilmente è meglio terminare il collegamento senza fare nient'altro.)

  9. Tutto fatto! I comandi Git ora dovrebbero funzionare dalla riga di comando. È possibile che pageant.exe carichi automaticamente il file .ppk all'avvio , a seconda della frequenza con cui sarà necessario.

Seconda soluzione Presuppone Windows, msysgit e TortoiseGit.

TortoiseGit viene fornito con eseguibili PuTTY e una versione appositamente modificata di plink (chiamata TortoisePlink.exe) che renderà le cose più facili.

  1. Installa msysgit e TortoiseGit come indicato.
  2. Se non lo hai già fatto, genera un hash chiave come indicato su GitHub o come indicato dal tuo host Git.
  3. Anche in questo caso, se non lo avete già fatto, di convertire la vostra chiave per l'uso con pageant.exe di TortoiseGit usando di TortoiseGit PuTTYgen.exe . Le istruzioni sono nella documentazione di PuTTY, nella guida utile collegata alla prima soluzione e in molti altri luoghi del cyberspazio.
  4. Esegui pageant.exe di TortoiseGit , apri il tuo file .ppk ("Aggiungi chiave") e fornisci la passphrase per la tua chiave.
  5. Accedi alla finestra di dialogo delle variabili di ambiente di Windows (fai clic con il pulsante destro del mouse su "Computer", fai clic su "Proprietà", fai clic su "Impostazioni di sistema avanzate" o sulla scheda "Avanzate", fai clic su "Variabili di ambiente"). Aggiungi la seguente variabile d'ambiente:

    GIT_SSH = C: \ piena \ percorso \ a \ TortoisePlink.exe

    Sostituisci "C: \ full \ path \ to" con il percorso di installazione completo su TortoiseGit, dove si trova TortoisePlink.exe. Probabilmente è meglio aggiungerlo alla sezione "Variabili utente". Inoltre, assicurarsi che il percorso utilizzato per TortoisePlink.exe corrisponda al percorso utilizzato per Pageant (pageant.exe). In alcuni casi potresti avere diverse installazioni di PuTTY perché potrebbe essere installato insieme ad altre applicazioni. L'uso di TortoisePlink.exe dall'installazione TortoiseGit e pageant.exe da un'altra installazione di un'altra applicazione (o da un'installazione PuTTY autonoma) probabilmente causerà problemi.

  6. Tutto fatto! I comandi Git ora dovrebbero funzionare dalla riga di comando. La prima volta che provi a connetterti al tuo repository git, verrai probabilmente informato che la chiave host del server non è memorizzata nella cache e ti verrà chiesto se ti fidi del server. Fai clic su "Sì". (Questo è TortoisePlink.exe in azione.)

    È possibile che pageant.exe carichi automaticamente il file .ppk all'avvio , a seconda della frequenza con cui sarà necessario.

Terza soluzione Presuppone Window, msysgit e prompt dei comandi nativo.

  1. Installa msysgit
  2. Assicurati di consentire l'utilizzo di git sul prompt dei comandi di MS-DOS
  3. Correre start-ssh-agent
  4. Immettere le passphrase SSH
  5. Tutto fatto! I comandi Git ora dovrebbero funzionare nel prompt dei comandi nativo.

3
Se hai entrambi GitExtensions e TortoiseGit, ognuno dei quali ha la propria versione di putty, assicurati di impostare la variabile d'ambiente GIT_SSH sul percorso del plink per il concorso che stai effettivamente utilizzando.
shovavnik,

15
Nel caso in cui qualcun altro incontri questo stupido errore: assicurati di utilizzare il formato URL remoto SSH (git @ host: accountname / reponame.git) non l'URL HTTPS altrimenti continuerà a chiedere quella password ...
dain

Quando eseguo plink.exe git@github.com, ottengo "ERRORE FATALE: connessione di rete inaspettatamente chiusa del server"
Brett

4
Nota: il metodo tre è stato upstream in msysgit quindi puoi semplicemente digitare start-ssh-agentnella riga di comando per farlo salvare la passphrase SSH.
Matt Clarkson,

6
La terza soluzione funziona solo fino alla chiusura del prompt dei comandi e solo per quel prompt dei comandi: tutti gli altri CMD richiedono ancora una passphrase. Inoltre, tutti gli altri client (VS, VS Code) non riescono a comunicare con git remoto.
Dima,

21

Ogni volta che installo un nuovo desktop dimentico queste istruzioni, quindi aggiungo un'altra risposta qui poiché mi imbatto spesso in esso allo stesso modo!


Passaggi rapidi per utenti impazienti come me

  1. Abilita il OpenSSH Authentication Agentservizio e avvialo automaticamente.
  2. Aggiungi la tua chiave SSH all'agente con ssh-adddalla riga di comando.
  3. Prova l'integrazione con git, se richiede ancora la tua passphrase, continua.
  4. Aggiungi la variabile d'ambiente $ENV:GIT_SSH=C:\Windows\System32\OpenSSH\ssh.exealla tua sessione o permanentemente al tuo ambiente utente.

Passaggi dettagliati: panoramica

Windows spedisce con OpenSSH da qualche tempo. Include tutti i bit necessari affinché ssh funzioni insieme a Git, ma sembra che abbia ancora bisogno di un po 'di TLC prima che funzioni perfettamente al 100%. Ecco i passaggi che ho seguito con successo a partire dalla versione 10.0.18362.449 di Windows (puoi vedere la tua versione di Windows 10 aprendo una shell cmd.exe e digitando ver).

Suppongo che tu abbia già la tua configurazione della chiave SSH e si trova in ~/.ssh/id_rsa

Abilita il servizio ssh-agent sulla tua casella di Windows 10.

  1. Avvia-> Digita "Servizi" e fai clic sull'app dei servizi visualizzata.
  2. Trova il OpenSSH Authentication Agentservizio nell'elenco.
  3. Fare clic con il tasto destro del mouse sul OpenSSH Authentication Agentservizio e selezionare "Proprietà".
  4. Cambia Startup type:in Automatic.
  5. Fare clic sul Startpulsante per modificare lo stato del servizioRunning .
  6. Chiudere la finestra di dialogo facendo clic OKe chiudere l'app Servizi.

Aggiungi la tua chiave al ssh-agent

  1. Apri la tua shell di preferenza (userò Windows Powershell in questo esempio, si applica anche a Powershell Core) .
  2. Aggiungi la tua chiave SSH a ssh-agent: ssh-add (puoi aggiungere il percorso alla tua chiave come primo argomento se differisce dal valore predefinito) .
  3. Immettere la passphrase se / quando richiesto.

Prova Git + SSH

  1. Apri la shell (di nuovo, sto usando Powershell) e clona un repository.git clone git@github.com:octocat/Spoon-Knife
  2. Se viene visualizzato questo messaggio, passare alla sezione successiva:
Enter passphrase for key '/c/Users/your_user_name/.ssh/id_rsa':

Imposta la GIT_SSHvariabile di ambiente

In qualsiasi sessione puoi semplicemente impostare questa variabile d'ambiente e il prompt per la tua passphrase smetterà di apparire e ssh userà il ssh-agentnome per tuo conto. In alternativa, è possibile impostare la passphrase nell'ambiente dell'utente in modo permanente.

Per impostare solo GIT_SSHnella shell corrente:

  1. Apri la tua shell di preferenza. (Powershell per me)
  2. Impostare la variabile di ambiente GIT_SSH sull'appropriato ssh.exe:$Env:GIT_SSH=$((Get-Command -Name ssh).Source)
  3. Riprova i passaggi in Prova Git + SSH sopra.

Per impostare in GIT_SSHmodo permanente

  1. Apri Esplora file. Avvia-> digita "Esplora file" e fai clic su di esso nell'elenco.
  2. Fare clic con il tasto destro del mouse su "Questo PC" e fare clic su "Proprietà".
  3. Fai clic su "Impostazioni di sistema avanzate".
  4. Fai clic sul pulsante "Variabili d'ambiente ...".
  5. In "Variabili utente per nome_utente" fai clic su Nuovo ...
  6. Imposta il Variable name:campo su GIT_SSH
  7. Impostare il Variable value:campo su path-to-ssh.exe (in genere C:\Windows\System32\OpenSSH\ssh.exe).
  8. Fare clic su OK per chiudere la finestra di dialogo Nuova variabile utente.
  9. Fare clic su OK per chiudere la finestra di dialogo Variabili d'ambiente.
  10. Riprova i passaggi in Prova Git + SSH sopra.

Si noti che questo probabilmente cambierà con nuovi passaggi / procedure man mano che Windows 10 avanza e mentre imparo di più. Cercherò di mantenerlo aggiornato, non vedo l'ora di ricevere feedback nei commenti.


3
Questa è la risposta più completa al 31/01/2020, almeno per Windows. Non è necessario installare PUTTY o altro.
Jake,

Concordato. Sembra che il supporto integrato sia finalmente arrivato.
Eron Lloyd

Leggenda! Questo ha risolto il mio problema. Sono stato alla ricerca di una soluzione per un po ', provando cose diverse e questo è senza dubbio il tenditore più completo di questo problema
Collin

Grazie per una bella risposta e una che mi ha salvato molto probabilmente qualche ora di pasticciare. +1
Angry 84

20

Per chiunque necessiti di istruzioni più dettagliate, consultare questa pagina: http://help.github.com/working-with-key-passphrases/


Esattamente quello che mi serviva per usare la msysgitshell.
Arturakay,

1
Ha funzionato per me durante l'utilizzo dell'app desktop Git Bash. Ho usato notepad ~/.profilee copiato il contenuto incollato da quel link, riavviato Git Bash, ho inserito la mia password, ho approfittato ...
Daryn,

Ho seguito la sezione "Avvio automatico di ssh-agent su Git per Windows" (usando git 2.x su Win 10) ma mi chiedeva comunque sempre la password. Dopo la prima soluzione (stucco) dalla risposta accettata, ho risolto questo problema per me.
jakub.g

20

Nel caso in cui si utilizzi Git bash in Windows, è possibile eseguire le seguenti operazioni:

eval `ssh-agent -s`
ssh-add ~/.ssh/*_rsa

chiederà la passphrase nel secondo comando, e basta. Ogni ulteriore azione che dovrai compiere (che una volta richiedeva la passphrase) non ti chiederà la passphrase (vedi un esempio nella schermata qui sotto):

aggiunta di passphrase in Git bash su Windows


2
Questo funziona anche nel sottosistema Ubuntu in Windows 10.
Meetar

1
nota che se la tua coppia di chiavi si trova altrove puoi sostituire ~ / .ssh / * _ rsa con il percorso del file * .pem
alex_danielssen

13

Una soluzione aggiuntiva 5 anni, 8 mesi e 6 giorni dopo la pubblicazione della domanda non sarebbe una cattiva idea, quindi ecco qui.

NOTA: si presume che si stia utilizzando un computer Windows.

  1. Scarica il git-credential-winstore .
  2. Eseguirlo! Se hai GIT nella tua PATHvariabile d'ambiente, dovrebbe funzionare. Se non lo fai, corri git-credential-winstore -i C:\Path\To\Git.exe.

La prossima volta che tenterai di impegnarti in un repository, ti verrà chiesto di inserire le tue credenziali. Questo dovrebbe essere. Non ti verranno più richieste le credenziali fino a quando non cambi la password.


Solo per tua conoscenza ... Le tue credenziali sono archiviate nell'archivio credenziali di Windows

Dove stai memorizzando le mie credenziali?

Questa app utilizza solo l'archivio credenziali di Windows esistente per conservare le tue credenziali. Puoi vedere le credenziali archiviate andando su Pannello di controllo> Account utente> Gestione credenziali e selezionando "Credenziali di Windows". Le voci che iniziano "git:" provengono da git-credential-winstore.


8
Questa soluzione sembra non funzionare con i repository SSH, solo HTTPS. / angryface
JasonCoder il

8

Se imposti una password per il tuo file chiave, dovrai sempre digitare quella password durante la connessione. Se crei una chiave senza password, non dovrai digitarla ogni volta, tuttavia, chiunque abbia accesso al tuo file di chiavi ora può connettersi al tuo account github.

ssh-agent può anche funzionare. Prova a eseguirlo e vedi se ricorderà la tua passphrase.


la corsa ssh-keygen -pdovrebbe consentire
all'OP di

Richiede ancora la password.
versedi

7

[modifica - fraintendi la domanda, questa è una risposta a un problema correlato. lasciando la versione riformulata per i posteri]

Il mio caso era che stavo cercando di inviare un repository ospitato su uno dei nostri server. Ogni volta che provavo a fare un push, git mi chiedeva la mia password (nb - password, non la passphrase della mia chiave privata).

Aggiungendo la mia chiave pubblica alle chiavi autorizzate sul server, sono stato in grado di ottenere push senza password su quel server. E, perché non c'era passphrase sulla mia chiave privata (che è una cattiva pratica tra l'altro!) Non ho avuto bisogno di digitare nulla.

Ecco il comando per aggiungere la tua chiave pubblica a un server. Presuppone che l'utente gitsia l'utente sul server.

cat .ssh/id_rsa.pub | ssh git@GIT_MASTER_IP 'cat >> .ssh/authorized_keys'

È possibile ottenere lo stesso risultato accedendo al server e aggiungendo manualmente la chiave pubblica al file all'indirizzo ~/.ssh/authorized_keys


Potresti convertirlo in una descrizione utilizzabile da qualcuno che non ha accesso a una shell? Ad esempio, cosa dovremmo mettere in authorized_keys usando un blocco note o simili?
John Little,

4

Mi rendo conto che è in ritardo da diversi anni, ma mi sono imbattuto in questa domanda cercando di trovare una soluzione, e ho trovato qualcosa che si adatta a tutti i livelli di competenza, quindi ho pensato di condividere.

GitHub fornisce un programma di installazione molto utile che rende tutto bello e semplice: https://help.github.com/articles/caching-your-github-password-in-git/


Si noti che questo sta memorizzando nella cache la password GitHub , non una passphrase della chiave GPG.
Giudice 2020,

4

Supponiamo che tu voglia utilizzare una soluzione Git Bash pura senza usare TortoiseGit o PuTTY. Inoltre, non si desidera archiviare le passphrase in modo permanente poiché è quasi uguale a come se si fosse generata la chiave SSH senza una passphrase. Ma vuoi comunque usare un po 'di cache.

ssh-agentViene utilizzato il processo di memorizzazione nella cache , incluso nella distribuzione Git Bash. Questo processo non è avviato per impostazione predefinita, quindi deve essere avviato prima. Per eventuali chiavi SSH da memorizzare nella cache, è necessario aggiungerle a questo processossh-add comando che richiederà la passphrase di una chiave e la memorizzerà in memoria.

Svantaggi di altre soluzioni:

  • L'avvio automatico ssh-agentcome nell'articolo di GitHub richiede una passphrase fin dall'inizio all'avvio di Git Bash, indipendentemente dal fatto che sia necessario utilizzare la chiave SSH in questa sessione o meno. Se stai lavorando con il tuo repository locale oggi probabilmente vorrai fornire una passphrase solo quando realmente necessario (ad esempio quando interagisci con un repository remoto).
  • Se lanci il tuo ssh-agentlike nell'articolo di GitLab con eval $(ssh-agent -s)probabilmente sei stanco di scriverlo ogni volta. È probabile che alla fine tu abbia aggiunto quelle due righe alla tua.bashrc configurazione per l'avvio automatico. Gli aspetti negativi sono gli stessi di cui sopra più uno in più: ogni volta che avvii un nuovo terminale Git Bash otterrai un ulteriore processo ssh-agent (lo script bash di GitHub verifica se quel processo è già stato avviato).
  • Come i due precedenti, ma soprattutto quando hai chiavi SSH separate per host diversi, ad esempio uno per GitHub e un altro per GitLab, quindi fornirli tutti in una volta è fastidioso e scomodo.

Quindi questa soluzione è per coloro che si chiedono come fare in modo che Git Bash richieda una passphrase solo una volta per sessione di Windows e solo quando realmente necessario. Assomiglia il comportamento di gestione passphrase con GnuPG commit auto-firma utilizzando default-cache-ttl.

Configurare SSH per richiedere passphrase una volta, quando necessario, usando solo Git Bash

  1. Innanzitutto, vogliamo avviare automaticamente l'avvio ssh-agentquando si avvia una shell Git Bash. Per questo useremo uno script GitHub modificato poiché controlla se il processo è già stato avviato, ma non vogliamo che sia ssh-addsubito pronto per le chiavi. Questo script va nella tua ~/.bashrco ~/.profileo ~/.bash_profile( ~è la directory home del tuo utente come C:\Users\Username- esegui cd ~e poi pwdper Git Bash per stamparlo):

    ### Start ssh-agent
    
    env=~/.ssh/agent.env
    
    agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
    
    agent_start () {
        (umask 077; ssh-agent >| "$env")  # use -t here for timeout
        . "$env" >| /dev/null ; }
    
    agent_load_env
    
    # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
    agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
    
    if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
        agent_start
    fi
    
    unset env
  2. Ora modifica o crea un ~/.ssh/configfile e aggiungi AddKeysToAgentun'opzione per ogni stanza dell'host che desideri attivare nella cache (puoi anche attivarla a livello globale posizionando la direttiva all'inizio del file prima di tutte le dichiarazioni dell'host):

    # GitHub.com
    Host github.com
      Preferredauthentications publickey
      IdentityFile ~/.ssh/id_ed25519_github
      AddKeysToAgent yes
    
    # GitLab.com
    Host gitlab.com
      Preferredauthentications publickey
      IdentityFile ~/.ssh/id_ed25519_gitlab
      AddKeysToAgent yes

    Dalla pagina man di ssh config : Se questa opzione è impostata su yes e una chiave viene caricata da un file, la chiave e la relativa passphrase vengono aggiunte all'agente con la durata predefinita, come se fosse ssh-add (1).

La durata massima predefinita è per sempre o fino a quando il ssh-agentprocesso non viene interrotto (manualmente dal task manager o allo spegnimento del PC). Se si desidera utilizzare un timeout finito, è possibile impostarlo con il -tparametro ssh-agent . Cambia la riga nello script bash dal primo passaggio sopra, ad es. Per 30 minuti di durata della cache chiave:

(umask 077; ssh-agent -t 30m >| "$env")

Vedi qui per altri qualificatori di formato orario.


3

Puoi creare un .bashrcfile nella home directory del tuo utente C:/Users/yourusere metterlo lì:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

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

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

Questo script viene eseguito ogni volta dopo l'esecuzione di bash. Quindi dovrai inserire la password solo una volta, quando git-bashviene avviato!

Alcune versioni di bash richiedono .bash_profileinvece file .bashrc, quindi nel caso clonare .bashrc:

copy .bashrc .bash_profile

1

puoi provare ad aggiungere -k arg quando lo fai;

ssh-add -k ~/.ssh/id_rsa
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.