web-dev-qa-db-fra.com

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

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 désormais 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)?

36
Nathan

La méthode que j'utilise consiste à utiliser un git pull Au 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).

Comme indiqué dans les commentaires, puisque cette méthode utilise HTTPS vous devez encoder l'URL de tout caractère spécial qui peut également apparaître dans votre mot de passe.

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
23
FGreg

OMI, la meilleure solution consiste à utiliser un assistant GIT_ASKPASS Personnalisé et à fournir le mot de passe comme une autre variable d'environnement. Ainsi, par exemple, créez un fichier git-askpass-helper.sh Comme:

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

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

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

19
intgr

Vous pouvez saisir vos identifiants de connexion dans votre ~/.netrc fichier. 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- fichier-sur-windows-pour-sauvegarder-utilisateur-et-mot de passe

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

14
Brett Levene

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

Voir Cheatsheet Git Credentials & Private Packages

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
    • Gemmes rubis Gemfile
    • golang go.mod

Meilleures options pour aucun stockage de texte en clair

D'après ce qui est demandé ici, soit les clés SSH, GIT_ASKPASS, ou git credential store l'utilisation du gestionnaire de trousseau OS pourrait ê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_ASKPASS script:

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://[email protected]/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 .

5
CoolAJ86