Comment éviter que le mot de passe pour déchiffrer la clé privée ne soit saisi à chaque fois lors de l'utilisation de Git Bash sous Windows?

125

J'ai un service de construction automatique qui télécharge à partir d'un référentiel privé git. Le problème est que lorsqu'il essaie de cloner le référentiel, il doit fournir le mot de passe, car il n'est pas mémorisé; donc parce qu'il n'y a pas d'interaction humaine, il attend toujours le mot de passe. Comment puis-je le forcer à se souvenir de id_rsa.pub?

D.Giunchi
la source

Réponses:

255

Pour les utilisateurs de Windows, il suffit de noter que c'est ainsi que je configure l'environnement Git Bash pour me connecter une fois lorsque je le démarre. J'édite mon ~/.bashrcfichier:

eval `ssh-agent`
ssh-add

Donc, quand je lance Git Bash, cela ressemble à:

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)

Et maintenant, je peux ssh vers d'autres serveurs sans me connecter à chaque fois.

starmonkey
la source
9
Si vous n'avez pas de fichier ~ / .bashrc, créez simplement un nouveau fichier texte (bloc-notes ou autre éditeur) et ajoutez les deux lignes starmonkey mentionnées.
pbz
7
'~' fait référence à votre "répertoire personnel". Sous Windows, vous pouvez le trouver en ouvrant un shell de commande (cmd) et en tapant "echo% USERPROFILE%".
Hawkeye Parker
14
Pour moi, cette syntaxe ne fonctionne pas. J'ai dû écrire à la eval $(ssh-agent)place.
choc du
1
Mon problème était que je devais spécifier le fichier à utiliser par ssh-add. Probablement parce que j'en ai plus d'un et que je n'utilisais pas le nom par défaut. Exemplessh-add ~/.ssh/myfile_rsa
Erreur de syntaxe
1
copy > ~/.bashrcdans git bash pour créer le fichier bashrc dans windows, ignorez l'erreur
Ruben
61

Cette réponse explique comment obtenir le nom d'utilisateur et le mot de passe GitHub à stocker de manière permanente, et non la phrase de passe de la clé SSH.

Sous Windows, exécutez simplement

$ git config --global credential.helper wincred

Cela signifie que la prochaine fois que vous poussez, vous entrerez votre nom d'utilisateur et votre mot de passe comme d'habitude, mais ils seront enregistrés dans les informations d'identification Windows. Vous n'aurez plus à les saisir à nouveau, après cela.

Comme dans, Push to GitHub sans entrer le nom d'utilisateur et le mot de passe à chaque fois (Git Bash sous Windows) .

Stephen Tun Aung
la source
2
après cette commande, vous devez taper votre nom d'utilisateur et votre mot de passe.
Stephen Tun Aung
5
Cela concerne-t-il les clés SSH ou uniquement l'authentification HTTPS (nom d'utilisateur et mot de passe)? La question semble concerner l'utilisation des clés SSH.
Sean
A parfaitement fonctionné pour moi, je suppose que j'utilise l'authentification HTTPS (nom d'utilisateur et mot de passe).
Jonatan du
L'exécution de ce produit n'a produit aucun résultat.
user9993
@ user9993 Ce ne sera pas le cas. C'est un changement de configuration, donc même si aucune sortie ne sera effectuée, gitcela changera son comportement en fonction de l'ensemble de directives de configuration.
starbeamrainbowlabs
9

Je préfère ne pas avoir à taper ma phrase de passe SSH lors de l'ouverture de nouveaux terminaux; Malheureusement, la solution de starmonkey nécessite que le mot de passe soit saisi pour chaque session. Au lieu de cela, j'ai ceci dans mon .bash_profiledossier:

# 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

Cela mémorisera également ma phrase de passe pour les nouvelles sessions de terminal; Je n'ai qu'à le taper une fois lorsque j'ouvre mon premier terminal après le démarrage.

Je voudrais créditer où j'ai eu ceci; c'est une modification du travail de quelqu'un d'autre, mais je ne me souviens pas d'où ça vient. Merci auteur anonyme!

Mise à jour 01/07/2019: Je ne pense pas que tout cela soit nécessaire. Cela fonctionne maintenant de manière cohérente en m'assurant que mon .bash_profilefichier exécute l'agent ssh:

eval $(ssh-agent)

Ensuite, j'ai mis en place un sshfichier de configuration comme celui-ci:

touch ~/.ssh/config
chmod 600 ~/.ssh/config
echo 'AddKeysToAgent yes' >> ~/.ssh/config
Conan
la source
On me demande toujours ma phrase secrète à chaque fois.
Ryan
1
@Ryan espérons que la mise à jour que je viens d'ajouter résoudra votre problème. Je garde les informations à jour dans un article de blog à conan.is/blogging/clojure-on-windows.html , et je me suis posé la même question sur stackoverflow.com/questions/52423626/…
Conan
Merci, je vais vérifier ça.
Ryan
@Conan La solution mise à jour fonctionne par session bash. Après avoir fermé ma session bash en cours et en ai ouvert une nouvelle, on m'a de nouveau invité à entrer le mot de passe.
Tushar Raj
5

Si je comprends bien la question, vous utilisez déjà une clé SSH autorisée dans le service de compilation, mais vous voulez éviter d'avoir à taper la phrase de passe pour chaque clone?

Je peux penser à deux façons de procéder:

  1. Si votre service de build est démarré de manière interactive: avant de démarrer le service de build, démarrez ssh-agentavec un délai d'expiration suffisamment long ( -toption). Ensuite, utilisez ssh-add(msysGit devrait les avoir) pour ajouter toutes les clés privées dont vous avez besoin avant de démarrer votre service de build. Vous devrez toujours taper toutes les phrases de passe, mais une seule fois par lancement de service.

  2. Si vous voulez éviter d'avoir à taper les mots de passe du tout, vous pouvez toujours supprimer les mots de passe des clés SSH, comme décrit dans /server/50775/how-do-i-change-my- private-key-passphrase , en définissant une nouvelle phrase de passe vide. Cela devrait supprimer complètement l'invite de mot de passe, mais elle est encore moins sécurisée que l'option précédente.

millimoose
la source
Merci pour la 2ème option, j'en avais besoin.
Stanislav Verjikovskiy
1

Lorsque j'ai essayé de pousser mon code, j'ai eu l'erreur ci-dessous:

$ git push origin dev

remote: Too many invalid password attempts. Try logging in through the website with your password.
fatal: unable to access 'https://[email protected]/xxxx/xxxx-api.git/': The requested URL returned error: 403

Après quelques heures de recherche, j'ai trouvé que je devais utiliser la commande ci-dessous:

$ git config --global credential.helper cache

Après avoir exécuté la commande ci-dessus, j'ai reçu une invite pour entrer mon nom d'utilisateur et mon mot de passe GitHub. Après avoir fourni les informations d'identification correctes, je suis en mesure de transmettre mon code.

Naushad Qamar
la source
Cela vient de générer "git: 'credential-cache' n'est pas une commande git." Cependant, "git config --global credential.helper store" fonctionnait - ce n'est peut-être pas le meilleur, mais je suis obligé d'utiliser HTTPS plutôt que mon SSH préféré et je veux juste qu'il fonctionne.
Terry Brown
0

La bonne solution est:

  1. Exécutez le terminal par défaut de Windows - cmd et obtenez le répertoire de votre profil principal

    echo %USERPROFILE%
    
  2. Exécutez Git Bash dans le répertoire ci-dessus et créez le .bashrcfichier avec la commande

    echo "" > .bashrc
    
  3. Ouvrez le .bashrcfichier avec votre éditeur de texte préféré et collez le code de l'aide GitHub dans ce fichier:

    env=~/.ssh/agent.env
    ...
    COPY WHOLE CODE FROM URL - I can't add it to Stack Overflow because it breaks layout... OMG!
    
  4. Redémarrez Git Bash et il vous demande votre mot de passe (seulement la première fois) et c'est fait. Aucun mot de passe ne dérange à nouveau.

Maniaco-dépression
la source
-1

Vous devez créer le authorized_keysfichier sous le .sshdossier de l'utilisateur sous lequel vous allez vous connecter au serveur de référentiel. Par exemple, en supposant que vous utilisez le nom buildserviced' utilisateur sur, repo.servervous pouvez exécuter:

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

Ensuite, vous devez vérifier les éléments suivants:

  1. Cette id_rsaclé privée correspondante est présentée dans [email protected]:~/.shh/id_rsa.

  2. Cette empreinte digitale de repo.server est stockée dans le [email protected]:~/.ssh/known_hostsfichier. En règle générale, cela sera fait après la première tentative de sshconnexion au repo.server.

bédouin
la source
J'oublie de dire. Sous Windows, votre répertoire de base serait probablement C: \ Users \ Username
beduin
5
Mmm .. Git bash a tout pour plaire, lisez plus attentivement le titre de la question. Aussi à partir de la question, j'ai supposé que la paire de clés avait déjà été générée (car on lui a demandé comment forcer le serveur de dépôt à se souvenir de id_rsa.pub.) Désolé pour le formatage.
beduin
1
Ok, jamais entendu parler de «git bash» auparavant. Désolé « combat qui
sehe
Je suppose que cela utilise msysgit. J'ajoute la balise.
Adam Dymitruk
3
Avertissement! L'utilisation cat id_rsa.pub > .ssh/authorized_keysécrasera toutes les clés autorisées existantes. Utilisez >>pour ajouter au lieu d'écraser.
David Pärsson