Comment donner un nom d'utilisateur / mot de passe à git clone dans un script, mais pas stocker les informations d'identification dans .git / config

31

Je clone un dépôt git dans un script comme celui-ci:

git clone https://user:[email protected]/name/.git

Cela fonctionne, mais mon nom d'utilisateur et mon mot de passe! sont maintenant stockés dans l'URL d'origine dans .git/config.

Comment puis-je empêcher cela, mais toujours le faire dans un script (donc pas de saisie manuelle de mot de passe)?

Nathan
la source
Vous pourriez probablement mettre à jour l'origine par la suite:git remote set-url origin https://host.com/name/.git
ceejayoz
@ceejayoz Oui, c'est possible. Merci pour l'idée. J'espère toujours une solution, qui ne stocke même pas temporairement les informations d'identification.
Nathan
4
Bien sûr - utilisez l'authentification basée sur SSH avec une clé.
ceejayoz
2
Y a-t-il une raison pour laquelle vous utilisez https au lieu de SSH? SSH prend en charge les clés.
mzhaase
1
@MartijnCourteaux Le mot de passe est en fait donné au script via une variable d'environnement. Je fais donc: git clone username: $ PASSWORD @ ...
Nathan

Réponses:

20

La méthode que j'utilise est d'utiliser réellement un git pullau lieu d'un clone. Le script ressemblerait à:

mkdir repo
cd repo
git init
git config user.email "email"
git config user.name "user"
git pull https://user:[email protected]/name/repo.git master

Cela ne stockera pas votre nom d'utilisateur ou votre mot de passe dans .git/config. Cependant, à moins que d'autres étapes ne soient prises, le nom d'utilisateur et le mot de passe en texte brut seront visibles pendant que le processus s'exécute à partir de commandes qui montrent les processus en cours (par exemple ps).

Une autre suggestion que je ferais (si vous ne pouvez pas utiliser ssh) est d'utiliser un jeton OAuth au lieu d'un nom d'utilisateur / mot de passe en clair car il est légèrement plus sécurisé. Vous pouvez générer un jeton OAuth à partir des paramètres de votre profil: https://github.com/settings/tokens .

Ensuite, en utilisant ce jeton, la commande pull serait

git pull https://$OAUTH_TOKEN:[email protected]/name/repo.git master
FGreg
la source
Malheureusement, je ne peux pas utiliser de jetons d'authentification. Je n'utilise pas github mais un serveur privé.
Nathan
3
Il convient également de noter que le nom d'utilisateur et le mot de passe seront visibles, par exemple, pspendant l'exécution du pull (au moins à moins que vous n'ayez empêché les utilisateurs de voir les processus des autres)
derobert
Points pour l'utilisation du serment. C'est exactement ce dont j'avais besoin en production / mise en scène / dev.
RobotHumans
un million grâce à toi mon pote. des heures gâchées n des heures n enfin votre réponse est revenue. : thumbsup
JasdeepSingh
17

IMO, la meilleure solution consiste à utiliser un GIT_ASKPASSassistant personnalisé et à fournir le mot de passe comme une autre variable d'environnement. Ainsi, par exemple, créez un fichier git-askpass-helper.shcomme:

#!/bin/sh
exec echo "$GIT_PASSWORD"

puis exécutez git clone https://username@hostname/repoavec les variables d'environnement GIT_ASKPASS=/path/to/git-askpass-helper.shet GIT_PASSWORD=nuclearlaunchcodes.

Cela a l'avantage que le mot de passe ne sera pas également visible dans la liste des processus.

intgr
la source
+1 pour une solution créative. Ce serait un peu plus sûr que la git pullsolution et vous permettrait de stocker le mot de passe en clair comme secret dans l'outil de déploiement automatisé de votre choix.
FGreg
13

Vous pouvez saisir vos identifiants de connexion dans votre ~/.netrcfichier. Quelque chose dans le sens de:

machine host.example.net
login bart
password eatmyshorts

Assurez-vous simplement de chmoder ce fichier à 600. Si vous utilisez Windows, le lien suivant peut être utile: https://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on- windows-to-save-user-and-password

Personnellement, j'ai tendance à utiliser les clés SSH à des fins d'authentification (si vous êtes autorisé, bien sûr).

Brett Levene
la source
Eh bien, cela laisserait mon mot de passe dans ~ / .netrc. Je ne veux pas non plus cela.
Nathan
2

Après avoir parcouru des dizaines de publications SO, de blogs, etc., j'ai essayé toutes les méthodes, et c'est ce que j'ai trouvé. Il couvre TOUT.

Voir la feuille de sécurité des informations d'identification et des packages privés Git

Ce sont tous les moyens et outils par lesquels vous pouvez authentifier git en toute sécurité pour cloner un référentiel sans invite de mot de passe interactif .

  • Clés publiques SSH
    • SSH_ASKPASS
  • Jetons d'accès API
    • GIT_ASKPASS
    • .gitconfig au lieu de
    • .gitconfig [informations d'identification]
    • .git-credentials
    • .netrc
  • Bonus: Fonctionne avec les packages privés
    • node / npm package.json
    • python / pip / eggs requirements.txt
    • ruby gems Gemfile
    • golang go.mod

Meilleures options pour aucun stockage de texte en clair

D'après ce qui est demandé ici, les clés SSH GIT_ASKPASSou l' git credential storeutilisation du gestionnaire de porte-clés du système d'exploitation peuvent être le meilleur choix.

Étant donné que GIT_ASKPASS est probablement le moins bien compris des 3, je vais le détailler ici - et les autres sont dans la feuille de triche.

GIT_ASKPASS

Comment créer un GIT_ASKPASSscript:

echo 'echo $MY_GIT_TOKEN' > $HOME/.git-askpass

Comment l'utiliser:

export MY_GIT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export GIT_ASKPASS=$HOME/.git-askpass
git clone https://token@code.example.com/project.git

Le script reçoit stdin sous la forme de:

Password for 'scheme://host.tld':

Le script reçoit des Git ENV tels que:

GIT_DIR=/Users/me/project/.git
GIT_EXEC_PATH=/usr/local/Cellar/git/2.19.0_1/libexec/git-core
GIT_PREFIX=

Plus de détails dans le cheatsheet .

CoolAJ86
la source