Configurare Git su SSH per effettuare il login una volta


195

Ho clonato il mio repository git su ssh. Quindi, ogni volta che comunico con il master di origine spingendo o tirando, devo inserire nuovamente la mia password. Come posso configurare git in modo da non dover inserire la mia password più volte?


7
Sembra un problema di sicurezza, non è necessario utilizzare alcuna password per eseguire normali commit, ma una spinta è il tipo di cosa con cui vorresti riautenticare, ma forse sono vecchio stile.
Alex Sexton,

Risposte:


104

Prova ssh-add, devi ssh-agentessere in esecuzione e tenere la tua chiave privata

(Ok, rispondendo alla domanda aggiornata, per prima cosa corri ssh-keygenper generare una chiave pubblica e privata come spiegato da Jefromi . Metti la chiave pubblica sul server. Dovresti usare una passphrase, se non hai l'equivalente di una semplice -testo password nella tua chiave privata. Ma quando lo fai, allora hai bisogno di una questione pratica come spiegato di seguito.)ssh-agent

Si desidera eseguire ssh-agentin background mentre si accede. Una volta effettuato l'accesso, l'idea è di eseguire ssh-adduna e una sola volta, al fine di fornire all'agente la passphrase, per decodificare la chiave. L'agente si trova quindi nella memoria con la chiave sbloccata e caricata, pronta per l'uso ogni volta che vai da qualche parte.

Tutti i comandi 1 della famiglia ssh consulteranno quindi l'agente e saranno automaticamente in grado di utilizzare la chiave privata.

Su sistemi OSX (err, macOS ), GNOME e KDE, ssh-agentviene di solito lanciato automaticamente per te. Esaminerò i dettagli nel caso in cui, come me, hai anche un Cygwin o un altro ambiente Windows in cui questo sicuramente non è fatto per te.

Inizia da qui: man ssh-agent.

Esistono vari modi per eseguire automaticamente l'agente. Come spiegato nella pagina man, è possibile eseguirlo in modo che sia un genitore di tutti gli altri processi della sessione di accesso. In questo modo, le variabili di ambiente che fornisce saranno automaticamente in tutte le tue shell. Quando (in seguito) invocherai ssh-addo sshentrambi avrai accesso all'agente perché tutti hanno le variabili di ambiente con nomi di socket magico o altro.

In alternativa, è possibile eseguire l'agente come un bambino normale, salvare le impostazioni dell'ambiente in un file e sorgente quel file in ogni shell all'avvio.

I miei sistemi OSX e Ubuntu eseguono automaticamente la configurazione di avvio dell'agente, quindi tutto ciò che devo fare è eseguire ssh-adduna volta. Prova a eseguire ssh-adde vedi se funziona, in tal caso, devi solo farlo una volta per riavvio.

Il mio sistema Cygwin doveva farlo manualmente, quindi l'ho fatto nel mio .profilee ho .bashrcfonte .profile:

. .agent > /dev/null
ps -p $SSH_AGENT_PID | grep ssh-agent > /dev/null || {
        ssh-agent > .agent
        . .agent > /dev/null
}

Il .agentfile viene creato automaticamente dallo script; contiene le definizioni delle variabili d'ambiente e le esportazioni. Quanto sopra tenta di generare il file .agent, quindi cerca ps(1)l'agente. Se non funziona, avvia un agente e crea un nuovo file agente. Puoi anche solo eseguire ssh-adde se fallisce avviare un agente.


1. E anche locale e remoto sudocon l'estensione pam corretta.


1
Invece di reperire l'output dal ssh-agentsuo probabilmente è più ordinato da usare:eval `ssh-agent`
scottsome

285

Ho avuto un problema simile con GitHub perché stavo usando il protocollo HTTPS. Per verificare quale protocollo stai utilizzando, esegui

git config -l

e guarda la linea che inizia con remote.origin.url. Per cambiare il protocollo

git config remote.origin.url git@github.com:your_username/your_project.git

12
Penso che questa dovrebbe essere la risposta ufficiale, ^ 5 @Muein!
Fer Martin,

14
questo non funziona quando il repository è privato e non sei il proprietario. Ho appena affrontato un Permission deniederrore.
Ogzd,

7
Questo è solo per un repository, come posso farlo a livello globale?
onmyway133,

2
@ogzd GitHub (o qualunque servizio tu stia utilizzando) necessita della tua chiave SSH pubblica prima che funzioni, ma questa è ancora la soluzione corretta.
MattM,

un'alternativa ègit remote set-url origin git@github.com:your_username/your_project.git
icosamuel,

24

Si tratta di configurare ssh, non git. Se non l'hai già fatto, dovresti usare ssh-keygen(con una passphrase vuota) per creare una coppia di chiavi. Quindi, si copia la chiave pubblica nella destinazione remota con ssh-copy-id. A meno che tu non abbia bisogno di più chiavi (ad es. Una più sicura con una passphrase per altri scopi) o di avere qualcosa di strano a identità multipla in corso, è così semplice:

ssh-keygen   # enter a few times to accept defaults
ssh-copy-id -i ~/.ssh/id_rsa user@host

Modifica: dovresti davvero leggere la risposta di DigitalRoss, ma: se usi le chiavi con passphrase, dovrai usarle ssh-add <key-file>per aggiungerle ssh-agent(e ovviamente avviare un ssh-agentse la tua distribuzione non ne ha già una in esecuzione per te).


2
Non sono sicuro che questo risponda alla domanda, deve averlo già fatto o non sarebbe in grado di raggiungere il sito. La risposta di cui ha bisogno è: ssh-agentcome vuole evitare il problema di inserire la passphrase ogni volta. Non sottovalutare, ma penso che tu debba migliorare questa risposta, a meno che non sia io quello che ha frainteso ...
DigitalRoss

2
@DigitalRoss: Ah, non ero sicuro di leggere la domanda se l'OP avesse effettivamente impostato le chiavi. Probabilmente hai ragione, però, e stavo deliberatamente cercando di suggerire di non usare una passphrase. Tuttavia, ovviamente hai ragione ssh-agent. +1 a te!
Cascabel,

Sono confuso se devo usare ssh-keygen o ssh-add. Nella mia directory ~ / .ssh / ho solo due file: config e known_hosts. Sembra che ssh-add richieda un altro file ~ / .ssh / id_rsa. Devo prima creare quel file usando ssh-keygen come spiegato da @Jefromi?
riprogrammatore

Sì, è necessario creare la chiave prima di poterla copiare sul server remoto. Penso che forse siamo stati confusi dal tuo uso della parola "passphrase" - questo è ciò che ssh-*chiama la passphrase necessaria per utilizzare la chiave - dove intendevi veramente la tua vera password utente sul telecomando?
Cascabel,

Sì, avrei dovuto dire la password invece della passphrase.
riprogrammatore

23

Accertati che quando hai clonato il repository, lo hai fatto con l'URL SSH e non con HTTPS; nella casella URL clone del repository, selezionare il protocollo SSH prima di copiare l'URL. Vedi l'immagine sotto:

inserisci qui la descrizione dell'immagine


23

Se hai clonato usando HTTPS (consigliato), allora: -

git config --global credential.helper cache

e poi

git config --global credential.helper 'cache --timeout=2592000'
  • timeout = 2592000 (30 giorni in secondi) per abilitare la memorizzazione nella cache per 30 giorni (o qualunque altra suite).

  • Ora esegui un semplice comando git che richiede il tuo nome utente e password.

  • Inserisci le tue credenziali una volta e ora la memorizzazione nella cache è abilitata per 30 giorni.

  • Riprova con qualsiasi comando git e ora non hai bisogno di credenziali.

  • Per maggiori informazioni: - Memorizzazione nella cache della password di GitHub in Git

Nota : è necessario Git 1.7.10 o versione successiva per utilizzare l'helper delle credenziali. Al riavvio del sistema, potrebbe essere necessario inserire nuovamente la password.


1
Sei un salvatore, stanco di digitare ogni volta username password. Grazie :)
Dave Ranjan il

si prega di specificare se questo è solo per Linux o solo Windows o entrambi.
Joedotnot,

@joedotnot per tutti i sistemi operativi. Puoi anche sfogliare il link menzionato e lì troverai l'opzione OS appena sotto l'intestazione.
Nishant Thapliyal,

Questo! Funziona in ogni caso.
Akaisteph7,

@Charles Ciao, ho appena provato lo stesso e funziona come previsto.
Nishant Thapliyal,

8

Estendere i pensieri di Muein per coloro che preferiscono modificare i file direttamente tramite i comandi in esecuzione in git-bash o terminal.

Vai alla directory .git del tuo progetto (root del progetto sul tuo computer locale) e apri il file 'config'. Quindi cerca [remote "origin"] e imposta la configurazione dell'URL come segue:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = git@github.com:<username>/<projectname>.git

1
Questo ha davvero aiutato. Modo sicuro e pulito per risolvere il problema. Penso che qualcuno dovrebbe migliorare la risposta di Muein con questo.
Luis Ortega Araneda,

1
"Vai alla directory .git del tuo progetto" provando per la prima volta
amuliar

Ottenere questo errore "fatale: non gestisco il protocollo 'git@github.com: <nomeutente> / https'"
Shivam Bharadwaj

@ShivamBharadwaj una rapida ricerca ha rivelato questa discussione stackoverflow.com/questions/30474447/… . Esiste la possibilità che tu stia copiando il comando git clone da qualche sito Web e ti imbatti in questo problema? Se sì, prova invece a digitare il comando completo.
uchamp,

6

Penso che ci siano due cose diverse qui. Il primo è che la normale autenticazione SSH richiede che l'utente inserisca la password dell'account (in cui la password dell'account verrà autenticata con metodi diversi, a seconda della configurazione di sshd).

Puoi evitare di inserire quella password usando i certificati. Con i certificati devi comunque inserire una password, ma questa volta è la password della tua chiave privata (indipendente dalla password dell'account).

Per fare ciò puoi seguire le istruzioni indicate da steveth45:

Con autenticazione con chiave pubblica .

Se vuoi evitare di inserire la password del certificato ogni volta, puoi usare ssh-agent, come sottolineato da DigitalRoss

Il modo esatto in cui lo fai dipende da Unix vs Windows, ma essenzialmente devi eseguire ssh-agent in background quando esegui l'accesso, quindi la prima volta che esegui l'accesso, esegui ssh-add per fornire all'agente la tua passphrase. Tutti i comandi della famiglia ssh consulteranno quindi l'agente e raccoglieranno automaticamente la passphrase.

Inizia qui: man ssh-agent.

L'unico problema di ssh-agent è che, almeno su * nix, è necessario inserire la password dei certificati su ogni nuova shell. E quindi il certificato viene "caricato" e puoi usarlo per autenticarti su un server SSH senza inserire alcun tipo di password. Ma questo è su quel particolare guscio.

Con il portachiavi puoi fare la stessa cosa di ssh-agent ma "a livello di sistema". Una volta acceso il computer, si apre una shell e si inserisce la password del certificato. E poi, ogni altra shell utilizzerà quel certificato "caricato" e la tua password non verrà mai più richiesta fino al riavvio del PC.

Gnome ha un'applicazione simile, chiamata Gnome Keyring che richiede la password del tuo certificato la prima volta che lo usi e poi lo memorizza in modo sicuro, così non ti verrà chiesto di nuovo.


Uso il portachiavi da solo: molto utile.
Jakub Narębski,

c'è un altro modo scrivendo AddKeysToAgent yesin .ssh / config. Quindi viene caricato nella memoria fino a quando non si spegne il computer
infocloggato il


4
ssh-keygen -t rsa

Quando ti viene richiesta una passphrase, lasciala vuota, cioè premi semplicemente invio. così semplice!!


4
Tieni presente che se lo fai, chiunque abbia accesso al tuo client di sviluppo ha accesso al server del repository senza bisogno di una password. La combinazione ssh-agent / ssh-add offre una sicurezza molto migliore.
Peter V. Mørch,

3

Prova questo dalla casella da cui stai spingendo

    ssh git@github.com

Dovresti quindi ottenere una risposta gradita da github e andrà bene poi spingere.


2
Funziona per me Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.Ma in qualche modo git mi chiede ancora la password quando provo a spingere
gkucmierz

2

Ho dovuto clonare un repository git da un server che non consentiva l'accesso tramite chiave ssh ma solo con un utente / password. Non ho trovato alcun modo per configurare il plug-in Git in modo da utilizzare una semplice combinazione utente / password, quindi ho aggiunto il seguente comando shell come passo pre-build su una macchina build linux che dipende dallo strumento previsto (apt-get install prevedono):

QUESTO NON È UN BUON MODO DI RISOLVERE QUESTO PROBLEMA COME LA TUA PASSWORD È INDICATA COME TESTO CHIARO NELLA CONFIGURAZIONE E NEI REGISTRI DEL LAVORO JENKINS! UTILIZZARLO SOLO SE NON È POSSIBILE CONFIGURARE L'AUTENTIFICAZIONE DI RSA-KEY O ALTRE POSSIBILITÀ DI CONFIGURAZIONE!

rm -rf $WORKSPACE &&
expect -c 'set timeout -1; spawn git clone USER@MYHOST:/MYPATH/MYREPO.git $WORKSPACE; expect "password:" {send "MYPASSWORD\r"}; expect eof'

1

Aggiungi una sola riga AddKeysToAgent yesnella parte superiore del file .ssh / config. Ofcourse ssh-agent deve essere in esecuzione in anticipo. Se non è in esecuzione (controllare da prep ssh-agent), quindi semplicemente eseguirloeval $(ssh-agent)

Ora, la chiave viene caricata in tutto il sistema nella memoria e non è necessario digitare nuovamente la passphrase.

La fonte della soluzione è /ubuntu/362280/enter-ssh-passphrase-once/853578#853578


0

Sto cercando di evitare di digitare sempre la passphrase anche perché sto usando ssh su Windows. Quello che ho fatto è stato modificare il mio file .profile, in modo da inserire il mio passphrase in una determinata sessione. Quindi questo è il pezzo di codice:

    SSH_ENV="$HOME/.ssh/environment"

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
        echo succeeded
        chmod 600 "$SSH_ENV"
        . "$SSH_ENV" > /dev/null
        ssh-add
    }

    # test for identities
    function test_identities {
        # test whether standard identities have been added to the agent already
        ssh-add -l | grep "The agent has no identities" > /dev/null
        if [ $? -eq 0 ]; then
            ssh-add
            # $SSH_AUTH_SOCK broken so we start a new proper agent
            if [ $? -eq 2 ];then
                start_agent
            fi
        fi
    }

    # check for running ssh-agent with proper $SSH_AGENT_PID
    if [ -n "$SSH_AGENT_PID" ]; then
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
      test_identities
        fi
    # if $SSH_AGENT_PID is not properly set, we might be able to load one from
    # $SSH_ENV
    else
        if [ -f "$SSH_ENV" ]; then
      . "$SSH_ENV" > /dev/null
        fi
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
            test_identities
        else
            start_agent
        fi
    fi

quindi con questo scrivo la mia passphrase una volta in una sessione ..


-1

Ho provato tutti questi suggerimenti e altro, solo per poter clonare dalla mia istanza AWS. Niente ha funzionato. Alla fine ho tradito la disperazione: ho copiato il contenuto di id_rsa.pub sul mio computer locale e l'ho aggiunto a ~ / .ssh / known_hosts sulla mia istanza AWS.


1
Sei sicuro di non voler dire ~ / .ssh / authorized_keys?
Kevin_Kinsey,
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.