Jak podać nazwę użytkownika / hasło dla git clone w skrypcie, ale nie przechowywać poświadczeń w .git / config

31

Klonuję repozytorium git w skrypcie takim jak ten:

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

To działa, ale moja nazwa użytkownika i hasło! są teraz przechowywane w adresie źródłowym w .git/config.

Jak mogę temu zapobiec, ale nadal zrobić to w skrypcie (aby nie wprowadzać hasła ręcznie)?

Nathan
źródło
Prawdopodobnie możesz później zaktualizować pochodzenie:git remote set-url origin https://host.com/name/.git
ceejayoz
@ceejayoz Tak, to możliwe. Dzięki za pomysł. Nadal mam nadzieję na rozwiązanie, które nawet nie tymczasowo przechowuje poświadczenia.
Nathan
4
Jasne - użyj klucza SSH opartego na SSH.
ceejayoz
2
Czy istnieje powód, dla którego używasz https zamiast SSH? SSH obsługuje klucze.
mzhaase
Rozumiem pytanie, ale dlaczego dobrze jest, jeśli hasło jest przechowywane w skrypcie? To równie złe.
Martijn Courteaux

Odpowiedzi:

20

Metodą, której używam, jest użycie git pullzamiast klonu. Skrypt wyglądałby następująco:

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

To nie będzie przechowywać twojej nazwy użytkownika ani hasła .git/config. Jednak o ile nie zostaną podjęte inne kroki, nazwa użytkownika i hasło w postaci zwykłego tekstu będą widoczne, gdy proces jest uruchomiony z poleceń wyświetlających bieżące procesy (np ps.).

Kolejną sugestią, którą chciałbym zrobić (jeśli nie możesz użyć ssh), jest użycie tokena OAuth zamiast nazwy użytkownika / hasła w postaci zwykłego tekstu, ponieważ jest on nieco bardziej bezpieczny. Możesz wygenerować token OAuth na podstawie ustawień profilu: https://github.com/settings/tokens .

Następnie za pomocą tego tokena polecenie pull byłoby

git pull https://$OAUTH_TOKEN:[email protected]/name/repo.git master
FGreg
źródło
Nieoficjalnie nie mogę używać tokenów uwierzytelniania. Nie używam github, ale prywatny serwer.
Nathan
3
Należy również zauważyć, że nazwa użytkownika i hasło będą widoczne np. psPodczas uruchamiania ściągania (przynajmniej chyba, że ​​uniemożliwisz użytkownikom wzajemne widzenie procesów)
derobert
Punkty za przysięgę. Właśnie tego potrzebowałem w produkcji / inscenizacji / devie.
RobotHumans,
milion dzięki tobie kolego. zmarnowane godziny n godziny n w końcu twoja odpowiedź przyszła ponownie. : thumbsup
JasdeepSingh
17

IMO najlepszym rozwiązaniem jest użycie niestandardowego GIT_ASKPASSpomocnika i podanie hasła jako innej zmiennej środowiskowej. Na przykład utwórz plik git-askpass-helper.shjako:

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

a następnie uruchom git clone https://username@hostname/repoze zmiennymi środowiskowymi GIT_ASKPASS=/path/to/git-askpass-helper.shi GIT_PASSWORD=nuclearlaunchcodes.

Ma to tę zaletę, że hasło nie będzie widoczne również na liście procesów.

intgr
źródło
+1 za kreatywne rozwiązanie. Byłoby to trochę bezpieczniejsze niż git pullrozwiązanie i pozwala przechowywać hasło w postaci zwykłego tekstu jako sekret w wybranym narzędziu do automatycznego wdrażania.
FGreg
13

Możesz wprowadzić dane uwierzytelniające połączenia w swoim ~/.netrcpliku. Coś w stylu:

machine host.example.net
login bart
password eatmyshorts

Upewnij się tylko, że chmod ten plik do 600. Jeśli używasz systemu Windows, przydatny może być następujący link: https://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on- windows-to-save-user-and-password

Osobiście mam tendencję do używania kluczy SSH do celów uwierzytelniania (oczywiście jeśli masz pozwolenie).

Brett Levene
źródło
Cóż, to pozostawiłoby moje hasło w ~ / .netrc. Ja też tego nie chcę.
Nathan
2

Po przejrzeniu kilkudziesięciu postów SO, blogów itp. Wypróbowałem każdą metodę i oto, co wymyśliłem. Obejmuje WSZYSTKO.

Zobacz The Git Credentials & Private Packages Cheatsheet

Są to wszystkie sposoby i narzędzia, za pomocą których możesz bezpiecznie uwierzytelnić git w celu sklonowania repozytorium bez interaktywnego pytania o hasło .

  • Klucze publiczne SSH
    • SSH_ASKPASS
  • Tokeny dostępu API
    • GIT_ASKPASS
    • .gitconfig zamiast
    • .gitconfig [dane logowania]
    • .git-credentials
    • .netrc
  • Bonus: Działa z pakietami prywatnymi
    • node / npm package.json
    • Python / pip / eggs wymagania.txt
    • rubinowe klejnoty Gemfile
    • Golang Go.mod

Najlepsze opcje bez przechowywania tekstu jawnego

Z tego, o co tutaj zapytano, klucze SSH GIT_ASKPASSlub git credential storeużycie menedżera pęku kluczy OS mogą być najlepszym wyborem.

Ponieważ GIT_ASKPASS jest prawdopodobnie najmniej zrozumiałym z 3, opiszę to tutaj - a pozostałe są w ściągawce.

GIT_ASKPASS

Jak stworzyć GIT_ASKPASSskrypt:

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

Jak tego użyć:

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

Skrypt otrzymuje standardowe wejście w postaci:

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

Skrypt odbiera Git ENV, takie jak:

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

Więcej szczegółów w ściągu .

CoolAJ86
źródło