So geben Sie dem git-Klon in einem Skript einen Benutzernamen / ein Kennwort, ohne die Anmeldeinformationen in .git / config zu speichern


31

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

git clone https://user:password@host.com/name/.git

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

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


Sie könnten den Ursprung wahrscheinlich später aktualisieren:git remote set-url origin https://host.com/name/.git
ceejayoz

@ceejayoz Ja, das ist möglich. Danke für die Idee. Ich hoffe immer noch auf eine Lösung, die die Anmeldeinformationen nicht einmal temporär speichert.
Nathan

4
Sicher - verwenden Sie SSH-basierte Authentifizierung mit einem Schlüssel.
Ceejayoz

2
Gibt es einen Grund, warum Sie https anstelle von SSH verwenden? SSH unterstützt Schlüssel.
mzhaase

Ich verstehe die Frage, aber warum ist das im Skript gespeicherte Passwort in Ordnung? Das ist genauso schlimm.
Martijn Courteaux

Antworten:


20

Die Methode, die ich benutze, besteht darin, a git pullanstelle eines Klons zu verwenden. Das Skript würde so aussehen:

mkdir repo
cd repo
git init
git config user.email "email"
git config user.name "user"
git pull https://user:password@github.com/name/repo.git master

In wird Ihr Benutzername oder Passwort nicht gespeichert .git/config. Sofern keine anderen Schritte ausgeführt werden, werden der Klartext-Benutzername und das Kennwort angezeigt, während der Prozess mit Befehlen ausgeführt wird, die aktuelle Prozesse anzeigen (z ps. B. ).

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

Mit diesem Token würde dann der Pull-Befehl lauten

git pull https://$OAUTH_TOKEN:x-oauth-basic@github.com/name/repo.git master

Leider kann ich keine Authentifizierungstoken verwenden. Ich benutze kein Github, sondern einen privaten Server.
Nathan

3
Zu beachten ist auch, dass der Benutzername und das Passwort beispielsweise pswährend des Pull-
Vorgangs

Punkte für den Gebrauch des Eides. Es ist genau das, was ich in Produktion / Inszenierung / Entwicklung brauchte.
RobotHumans

Eine Million dank dir Kumpel. verschwendete stunden n stunden n endlich kam deine antwort zu retten. : thumbsup
JasdeepSingh

17

IMO ist die beste Lösung, einen benutzerdefinierten GIT_ASKPASSHelfer zu verwenden und das Kennwort als weitere Umgebungsvariable bereitzustellen. So erstellen Sie beispielsweise eine Datei git-askpass-helper.shals:

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

und dann git clone https://username@hostname/repomit Umgebungsvariablen GIT_ASKPASS=/path/to/git-askpass-helper.shund ausführen GIT_PASSWORD=nuclearlaunchcodes.

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


+1 für kreative Lösung. Dies ist etwas sicherer als die git pullLösung und ermöglicht es Ihnen, das Klartextkennwort als Geheimnis in Ihrem bevorzugten Tool für die automatische Bereitstellung zu speichern.
FGreg

13

Sie können Ihre Verbindungsdaten in Ihre ~/.netrcDatei eintragen . Etwas in der Art von:

machine host.example.net
login bart
password eatmyshorts

Stellen Sie einfach sicher, dass diese Datei auf 600 geändert wird. Wenn Sie Windows verwenden, kann der folgende Link nützlich sein: https://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on- Windows-to-Save-Benutzer-und-Passwort

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


Nun, dies würde mein Passwort in ~ / .netrc belassen. Das will ich auch nicht.
Nathan

2

Nachdem ich Dutzende von SO-Posts, Blogs usw. durchgesehen hatte, habe ich jede Methode ausprobiert . Es deckt ALLES ab.

Siehe Das Cheatsheet zu Git-Anmeldeinformationen und privaten Paketen

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 / eggs requirements.txt
    • Rubin Edelsteine ​​Gemfile
    • golang go.mod

Beste Optionen für keinen Klartextspeicher

Von den hier gestellten Fragen sind entweder SSH-Schlüssel GIT_ASKPASSoder die git credential storeVerwendung des Betriebssystem-Schlüsselbund-Managers die beste Wahl.

Da GIT_ASKPASS von den 3 wahrscheinlich am wenigsten verstanden wird, werde ich das hier detailliert beschreiben - und die anderen sind im Spickzettel.

GIT_ASKPASS

So erstellen Sie ein GIT_ASKPASSSkript:

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://token@code.example.com/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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.