it-swarm.com.de

So geben Sie dem Git-Klon in einem Skript einen Benutzernamen / ein Kennwort, speichern jedoch keine Anmeldeinformationen in .git / config

Ich klone ein Git-Repository in einem Skript wie diesem:

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

Das funktioniert, aber mein Benutzername und mein Passwort! sind jetzt in der Origin-URL in .git/config gespeichert.

Wie kann ich dies verhindern, dies aber dennoch in einem Skript tun (also keine manuelle Passworteingabe)?

36
Nathan

Die Methode, die ich verwende, besteht darin, tatsächlich einen git pull Anstelle eines Klons zu verwenden. Das Skript würde folgendermaßen aussehen:

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

Dadurch wird Ihr Benutzername oder Passwort nicht in .git/config Gespeichert. Sofern keine anderen Schritte unternommen werden, sind der Klartext-Benutzername und das Kennwort sichtbar, während der Prozess über Befehle ausgeführt wird, die aktuelle Prozesse anzeigen (z. B. ps).

Wie in den Kommentaren erwähnt, verwendet diese Methode HTTPS Sie müssen alle Sonderzeichen per URL codieren , die möglicherweise auch in Ihrem Kennwort enthalten sind.

Ein weiterer Vorschlag, den ich machen würde (wenn Sie ssh nicht verwenden können), ist die Verwendung eines OAuth -Tokens anstelle eines Klartext-Benutzernamens/-Kennworts, da es etwas sicherer ist. Sie können aus Ihren Profileinstellungen ein OAuth - Token generieren: https://github.com/settings/tokens .

Dann würde mit diesem Token der Pull-Befehl lauten

git pull https://$OAUTH_TOKEN:[email protected]/name/repo.git master
23
FGreg

IMO ist die beste Lösung die Verwendung eines benutzerdefinierten GIT_ASKPASS Helfer und liefern das Passwort als eine andere Umgebungsvariable. Erstellen Sie beispielsweise eine Datei git-askpass-helper.sh wie:

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

und dann git clone https://[email protected]/repo mit Umgebungsvariablen GIT_ASKPASS=/path/to/git-askpass-helper.sh und GIT_PASSWORD=nuclearlaunchcodes.

Dies hat den Vorteil, dass das Passwort auch in der Prozessliste nicht sichtbar ist.

19
intgr

Sie können Ihre Verbindungs-Creds in Ihre ~/.netrc Datei. Etwas in der Art von:

machine Host.example.net
login bart
password eatmyshorts

Stellen Sie einfach sicher, dass Sie diese Datei auf 600 ändern. Wenn Sie Windows verwenden, kann der folgende Link hilfreich sein: https://stackoverflow.com/questions/6031214/git-how-to-use-netrc- Datei-unter-Windows-zum-Speichern-Benutzer-und-Passwort

Persönlich neige ich dazu, SSH-Schlüssel für Authentifizierungszwecke zu verwenden (wenn Sie das dürfen, natürlich).

14
Brett Levene

Nachdem ich Dutzende von SO Posts, Blogs usw.) durchgesehen hatte, probierte ich alle Methode, und das habe ich mir ausgedacht. Es umfasst alles.

Siehe Das Cheatsheet für Git-Anmeldeinformationen und private Pakete

Dies sind alle Möglichkeiten und Tools, mit denen Sie git sicher authentifizieren können, um ein Repository ohne eine interaktive Kennwortabfrage zu klonen.

  • Öffentliche SSH-Schlüssel
    • SSH_ASKPASS
  • API-Zugriffstoken
    • GIT_ASKPASS
    • .gitconfig statt
    • .gitconfig [Berechtigungsnachweis]
    • .git-Anmeldeinformationen
    • .netrc
  • Bonus: Funktioniert mit privaten Paketen
    • node/npm package.json
    • python/pip/eier anforderungen.txt
    • Rubin Edelsteine ​​Gemfile
    • golang go.mod

Beste Optionen für keinen Klartext-Speicher

Von dem, was hier gefragt wird, entweder SSH-Schlüssel, GIT_ASKPASS, oder git credential store Die Verwendung des OS-Schlüsselbund-Managers ist möglicherweise die beste Wahl.

Da GIT_ASKPASS wahrscheinlich das am wenigsten verstandene der 3 ist, werde ich das hier detailliert beschreiben - und die anderen sind im Cheatsheet.

GIT_ASKPASS

So erstellen Sie ein GIT_ASKPASS Skript:

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

Wie man es benutzt:

export MY_GIT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export GIT_ASKPASS=$HOME/.git-askpass
git clone https://[email protected]/project.git

Das Skript erhält stdin in Form von:

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

Das Skript empfängt Git ENVs wie:

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

Weitere Details im Cheatsheet .

5
CoolAJ86