Configurer Git sur SSH pour se connecter une fois

195

J'ai cloné mon dépôt git sur ssh. Donc, chaque fois que je communique avec le maître d'origine en poussant ou en tirant, je dois ressaisir mon mot de passe. Comment configurer git pour ne pas avoir à saisir mon mot de passe plusieurs fois?

reprogrammeur
la source
7
On dirait un problème de sécurité, vous n'avez pas besoin d'utiliser de mot de passe pour effectuer des validations normales, mais une poussée est le type de chose avec laquelle vous voudriez vous ré-authentifier, mais peut-être que je suis démodé.
Alex Sexton

Réponses:

104

Essayez ssh-add, vous devez ssh-agentexécuter et maintenir votre clé privée

(Ok, répondant à la question mise à jour, vous exécutez d'abord ssh-keygenpour générer une clé publique et privée comme l' explique Jefromi . Vous mettez la clé publique sur le serveur. Vous devez utiliser une phrase secrète, si vous ne l'avez pas, vous avez l'équivalent d'une plaine -mot de passe texte dans votre clé privée. Mais lorsque vous le faites, vous devez en pratique, comme expliqué ci-dessous.)ssh-agent

Vous souhaitez être exécuté ssh-agenten arrière-plan lorsque vous vous connectez. Une fois connecté, l'idée est d'exécuter ssh-addune seule et unique fois, afin de donner à l'agent votre phrase secrète, pour décoder votre clé. L'agent reste alors en mémoire avec votre clé déverrouillée et chargée, prête à être utilisée chaque fois que vous utilisez quelque part.

Toutes les commandes de la famille ssh 1 consulteront alors l'agent et pourront automatiquement utiliser votre clé privée.

Sur OSX (err, macOS ), les systèmes GNOME et KDE ssh-agentsont généralement lancés automatiquement pour vous. Je vais passer en revue les détails au cas où, comme moi, vous avez également un environnement Cygwin ou d'autres fenêtres où cela n'est certainement pas fait pour vous.

Commencez ici: man ssh-agent.

Il existe différentes manières d'exécuter automatiquement l'agent. Comme l'explique la page de manuel, vous pouvez l'exécuter pour qu'elle soit le parent de tous les autres processus de votre session de connexion. De cette façon, les variables d'environnement qu'il fournit seront automatiquement dans tous vos shells. Lorsque vous invoquerez (plus tard) ssh-addou les sshdeux auront accès à l'agent car ils ont tous les variables d'environnement avec des chemins d'accès de socket magique ou autre.

Vous pouvez également exécuter l'agent en tant qu'enfant ordinaire, enregistrer les paramètres d'environnement dans un fichier et source ce fichier dans chaque shell au démarrage.

Mes systèmes OSX et Ubuntu effectuent automatiquement la configuration du lancement de l'agent, donc tout ce que j'ai à faire est de l'exécuter ssh-addune seule fois. Essayez de courir ssh-addet voyez si cela fonctionne, si c'est le cas, il vous suffit de le faire une fois par redémarrage.

Mon système Cygwin avait besoin que cela soit fait manuellement, donc je l'ai fait dans mon .profileet j'ai une .bashrcsource .profile:

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

Le .agentfichier est créé automatiquement par le script; il contient les définitions et les exportations des variables d'environnement. Ce qui précède tente de source le fichier .agent, puis essaie à ps(1)l'agent. Si cela ne fonctionne pas, il démarre un agent et crée un nouveau fichier d'agent. Vous pouvez également simplement exécuter ssh-addet en cas d'échec démarrer un agent.


1. Et même local et distant sudoavec la bonne extension pam.

DigitalRoss
la source
1
Plutôt que de s'approvisionner en sortie, ssh-agentil est probablement plus pratique d'utiliser:eval `ssh-agent`
scottsome
285

J'ai eu un problème similaire avec le GitHub parce que j'utilisais le protocole HTTPS. Pour vérifier le protocole que vous utilisez, lancez

git config -l

et regardez la ligne commençant par remote.origin.url. Pour changer de protocole

git config remote.origin.url [email protected]:your_username/your_project.git
Muein Muzamil
la source
12
Je pense que cela devrait être la réponse officielle, ^ 5 @Muein!
Fer Martin
14
cela ne fonctionne pas lorsque le dépôt est privé et que vous n'êtes pas le propriétaire. Je viens de faire face à une Permission deniederreur.
ogzd
7
C'est pour un seul dépôt, comment puis-je le faire globalement?
onmyway133
2
@ogzd GitHub (ou tout autre service que vous utilisez) a besoin de votre clé SSH publique avant que cela ne fonctionne, mais c'est toujours la bonne solution.
MattM
une alternative estgit remote set-url origin [email protected]:your_username/your_project.git
icosamuel
24

Il s'agit de configurer ssh, pas git. Si vous ne l'avez pas déjà fait, vous devez utiliser ssh-keygen(avec une phrase de passe vide) pour créer une paire de clés. Ensuite, vous copiez la clé publique vers la destination distante avec ssh-copy-id. À moins que vous n'ayez besoin de plusieurs clés (par exemple, une clé plus sécurisée avec une phrase secrète à d'autres fins) ou que vous ayez des trucs d'identité multiple vraiment étranges, c'est aussi simple que cela:

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

Edit: Vous devriez vraiment lire la réponse de DigitalRoss, mais: si vous utilisez des clés avec des mots de passe, vous devrez les utiliser ssh-add <key-file>pour les ajouter ssh-agent(et évidemment démarrer un ssh-agentsi votre distribution n'en a pas déjà une pour vous).

Cascabel
la source
2
Je ne suis pas sûr que cela réponde à la question, il doit avoir déjà fait cela ou il ne pourrait pas accéder au site. La réponse dont il a besoin est:, ssh-agentcar il veut contourner le problème de la phrase de passe à chaque fois. Pas de downvoting mais je pense que vous devez améliorer cette réponse, sauf si je suis celui qui a mal compris ...
DigitalRoss
2
@ DigitalRoss: Ah, je ne savais pas à la lecture de la question si l'OP avait réellement les clés configurées. Vous avez probablement raison cependant, et j'essayais délibérément de suggérer de ne pas utiliser de phrase secrète. Cependant, vous avez bien sûr raison ssh-agent. +1 à vous!
Cascabel
Je ne sais pas si je dois utiliser ssh-keygen ou ssh-add. Dans mon répertoire ~ / .ssh /, je n'ai que deux fichiers: config et known_hosts. Il semble que ssh-add nécessite un autre fichier ~ / .ssh / id_rsa. Dois-je d'abord créer ce fichier en utilisant ssh-keygen comme expliqué @Jefromi?
reprogrammeur
Oui, vous devez créer la clé avant de pouvoir la copier sur le serveur distant. Je pense que nous avons peut-être été confondus par votre utilisation du mot "phrase secrète" - c'est ce ssh-*que la phrase secrète appelle pour utiliser la clé - où vous vouliez vraiment dire votre mot de passe utilisateur réel sur la télécommande?
Cascabel
Oui, j'aurais dû dire le mot de passe au lieu de la phrase secrète.
reprogrammeur
23

Assurez-vous que lorsque vous avez cloné le référentiel, vous l'avez fait avec l'URL SSH et non le HTTPS; dans la zone URL de clonage du référentiel, choisissez le protocole SSH avant de copier l'URL. Voir l'image ci-dessous:

entrez la description de l'image ici

Zorayr
la source
23

Si vous avez cloné en utilisant HTTPS (recommandé), alors: -

git config --global credential.helper cache

puis

git config --global credential.helper 'cache --timeout=2592000'
  • timeout = 2592000 (30 jours en secondes) pour activer la mise en cache pendant 30 jours (ou toutes les suites que vous).

  • Exécutez maintenant une simple commande git qui nécessite votre nom d'utilisateur et votre mot de passe.

  • Entrez vos informations d'identification une fois et la mise en cache est désormais activée pendant 30 jours.

  • Réessayez avec n'importe quelle commande git et maintenant vous n'avez plus besoin d'informations d'identification.

  • Pour plus d'informations: - Mise en cache de votre mot de passe GitHub dans Git

Remarque : Vous avez besoin de Git 1.7.10 ou d'une version plus récente pour utiliser l'assistant d'informations d'identification. Au redémarrage du système, nous devrons peut-être saisir à nouveau le mot de passe.

Nishant Thapliyal
la source
1
Vous êtes un sauveur, fatigué de taper le mot de passe du nom d'utilisateur à chaque fois. Merci :)
Dave Ranjan
veuillez préciser s'il s'agit de Linux uniquement ou de Windows uniquement ou des deux.
joedotnot
@joedotnot pour tous les OS. Vous pouvez également parcourir le lien mentionné et vous y trouverez l'option OS juste en dessous de l'en-tête.
Nishant Thapliyal
Ce! Fonctionne dans tous les cas.
Akaisteph7
@Charles Salut, je viens de tester la même chose et cela fonctionne comme prévu.
Nishant Thapliyal
8

Étendre les pensées de Muein à ceux qui préfèrent éditer les fichiers directement sur les commandes en cours d'exécution dans git-bash ou terminal.

Accédez au répertoire .git de votre projet (racine du projet sur votre machine locale) et ouvrez le fichier 'config'. Recherchez ensuite [origine "distante] et définissez la configuration d'URL comme suit:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = [email protected]:<username>/<projectname>.git
uchamp
la source
1
Cela a vraiment aidé. Un moyen sûr et propre de résoudre le problème. Je pense que quelqu'un devrait améliorer la réponse de Muein avec celle-ci.
Luis Ortega Araneda
1
"Accédez au répertoire .git de votre projet" première tentative
amuliar
Obtenir cette erreur "fatal: je ne gère pas le protocole '[email protected]: <username> / https'"
Shivam Bharadwaj
@ShivamBharadwaj une recherche rapide a révélé ce thread stackoverflow.com/questions/30474447/… . Est-il possible que vous copiez la commande git clone à partir d'un site Web et que vous rencontriez ce problème? Si oui, essayez plutôt de taper la commande complète.
uchamp
6

Je pense qu'il y a deux choses différentes ici. La première est que l'authentification SSH normale nécessite que l'utilisateur mette le mot de passe du compte (où le mot de passe du compte sera authentifié par différentes méthodes, selon la configuration de sshd).

Vous pouvez éviter de mettre ce mot de passe à l'aide de certificats. Avec les certificats, vous devez toujours mettre un mot de passe, mais cette fois, c'est le mot de passe de votre clé privée (qui est indépendant du mot de passe du compte).

Pour ce faire, vous pouvez suivre les instructions indiquées par steveth45:

Avec authentification par clé publique .

Si vous voulez éviter de mettre le mot de passe du certificat à chaque fois, vous pouvez utiliser ssh-agent, comme l'a souligné DigitalRoss

La façon exacte dont vous procédez dépend d'Unix par rapport à Windows, mais vous devez essentiellement exécuter ssh-agent en arrière-plan lorsque vous vous connectez, puis la première fois que vous vous connectez, exécutez ssh-add pour donner à l'agent votre phrase secrète. Toutes les commandes de la famille ssh consulteront alors l'agent et récupéreront automatiquement votre phrase secrète.

Commencez ici: man ssh-agent.

Le seul problème de ssh-agent est que, sur * nix au moins, vous devez mettre le mot de passe des certificats sur chaque nouveau shell. Et puis le certificat est "chargé" et vous pouvez l'utiliser pour vous authentifier auprès d'un serveur ssh sans mettre de mot de passe. Mais c'est sur cette coquille particulière.

Avec le trousseau, vous pouvez faire la même chose que ssh-agent mais "à l'échelle du système". Une fois que vous allumez votre ordinateur, vous ouvrez un shell et mettez le mot de passe du certificat. Et puis, chaque autre shell utilisera ce certificat "chargé" et votre mot de passe ne sera plus jamais demandé jusqu'à ce que vous redémarriez votre PC.

Gnome a une application similaire, appelée Gnome Keyring qui demande le mot de passe de votre certificat la première fois que vous l'utilisez, puis il le stocke en toute sécurité afin que vous ne soyez plus invité.

Gaston
la source
J'utilise moi - même le trousseau : très utile.
Jakub Narębski
il y a une autre façon d'écrire AddKeysToAgent yesen .ssh / config. Ensuite, il est chargé dans la mémoire jusqu'à ce que vous
éteigniez
4
ssh-keygen -t rsa

Lorsque vous êtes invité à saisir une phrase secrète, laissez-la vide, c'est-à-dire appuyez simplement sur Entrée. aussi simple que cela!!

Srinivas Kattimani
la source
4
N'oubliez pas que si vous procédez ainsi, toute personne ayant accès à votre client de développement a accès au serveur de référentiel sans avoir besoin d'un mot de passe. Le combo ssh-agent / ssh-add offre une bien meilleure sécurité.
Peter V. Mørch
3

Essayez ceci depuis la boîte à partir de laquelle vous appuyez

    ssh [email protected]

Vous devriez alors obtenir une réponse bienvenue de github et vous pourrez ensuite pousser.

toonsend
la source
2
Ça marche pour moi Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.Mais en quelque sorte git me demande toujours le mot de passe quand j'essaye de pousser
gkucmierz
2

J'ai dû cloner un dépôt git à partir d'un serveur qui n'autorisait pas la clé de connexion vie ssh mais uniquement avec un utilisateur / mot de passe. Je n'ai trouvé aucun moyen de configurer le plugin Git pour utiliser une simple combinaison utilisateur / mot de passe, j'ai donc ajouté la commande shell suivante en tant qu'étape de pré-génération sur une machine de construction Linux qui dépend de l'outil attendu (apt-get install expect):

CE N'EST PAS UNE BONNE MANIÈRE DE RÉSOUDRE CE PROBLÈME COMME VOTRE MOT DE PASSE EST MONTRÉ COMME UN TEXTE CLAIR DANS LA CONFIGURATION ET LES JOURNAUX DU TRAVAIL JENKINS! UTILISEZ-LE UNIQUEMENT SI IL N'Y A PAS DE MOYEN DE CONFIGURER L'AUTHENTIFICATION PAR CLÉ RSA OU D'AUTRES POSSIBILITÉS DE CONFIGURATION!

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

Ajoutez une seule ligne AddKeysToAgent yesen haut du fichier .ssh / config. Bien sûr, ssh-agent doit être en cours d'exécution au préalable. Si ce n'est pas en cours d'exécution (vérifiez par prep ssh-agent), exécutez-le simplementeval $(ssh-agent)

Maintenant, la clé est chargée à l'échelle du système dans la mémoire et vous n'avez pas besoin de taper à nouveau la phrase secrète.

La source de la solution est /ubuntu/362280/enter-ssh-passphrase-once/853578#853578

infoclogged
la source
0

J'ai toujours essayé d'éviter de taper la phrase secrète parce que j'utilise ssh sur Windows. Ce que j'ai fait, c'est de modifier mon fichier .profile, afin que j'entre ma phrase secrète dans une session particulière. Voici donc le morceau de code:

    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

donc avec cela je tape ma phrase de passe une fois dans une session ..

David Blay
la source
-1

J'ai essayé toutes ces suggestions et plus, juste pour pouvoir git cloner à partir de mon instance AWS. Rien n'a fonctionné. J'ai finalement triché par désespoir: j'ai copié le contenu de id_rsa.pub sur ma machine locale et l'ai ajouté à ~ / .ssh / known_hosts sur mon instance AWS.

alansendgi
la source
1
Êtes-vous sûr de ne pas vouloir dire ~ / .ssh / authorized_keys?
Kevin_Kinsey