Cara memberi nama pengguna / kata sandi untuk mendapatkan klon dalam skrip, tetapi tidak menyimpan kredensial di .git / config

31

Saya mengkloning repositori git dalam skrip seperti ini:

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

Ini berfungsi, tetapi nama pengguna dan kata sandi saya! sekarang disimpan di url asal di .git/config.

Bagaimana saya bisa mencegah ini, tetapi masih melakukan ini dalam skrip (jadi tidak ada input kata sandi manual)?

Nathan
sumber
Anda mungkin dapat memperbarui asal setelahnya:git remote set-url origin https://host.com/name/.git
ceejayoz
@ceejayoz Ya, itu mungkin. Terima kasih atas idenya. Saya masih mencari solusi, yang bahkan tidak menyimpan kredensial sementara.
Nathan
4
Tentu - gunakan auth berbasis SSH dengan kunci.
ceejayoz
2
Apakah ada alasan Anda menggunakan https alih-alih SSH? SSH mendukung kunci.
mzhaase
1
@MartijnCourteaux Kata sandi sebenarnya diberikan kepada skrip melalui variabel enviornment. Jadi saya benar-benar melakukannya: nama pengguna clit git : $ PASSWORD @ ...
Nathan

Jawaban:

20

Metode yang saya gunakan adalah benar-benar menggunakan git pullbukan klon. Script akan terlihat seperti:

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

Ini tidak akan menyimpan nama pengguna atau kata sandi Anda di .git/config. Namun, kecuali jika langkah lain diambil, nama pengguna dan kata sandi plaintext akan terlihat saat proses berjalan dari perintah yang menunjukkan proses saat ini (misalnya ps).

Satu saran lebih lanjut yang akan saya buat (jika Anda tidak dapat menggunakan ssh) adalah untuk benar-benar menggunakan token OAuth alih-alih nama pengguna / kata sandi plaintext karena sedikit lebih aman. Anda dapat membuat token OAuth dari pengaturan profil Anda: https://github.com/settings/tokens .

Kemudian menggunakan token itu perintah tarik akan

git pull https://$OAUTH_TOKEN:[email protected]/name/repo.git master
FGreg
sumber
Secara tidak langsung saya tidak dapat menggunakan token auth. Saya tidak menggunakan github tetapi server pribadi.
Nathan
3
Harus juga dicatat bahwa nama pengguna dan kata sandi akan terlihat di, misalnya, psketika tarikan berjalan (setidaknya kecuali Anda telah mencegah pengguna melihat proses satu sama lain)
derobert
Poin untuk penggunaan sumpah. Persis seperti yang saya butuhkan dalam produksi / pementasan / dev.
RobotHumans
sejuta terima kasih sobat. terbuang berjam-jam dan berjam-jam dan akhirnya jawaban Anda kembali. : thumbsup
JasdeepSingh
17

IMO solusi terbaik adalah menggunakan GIT_ASKPASSpenolong khusus dan mengirimkan kata sandi sebagai variabel lingkungan lain. Jadi misalnya, buat file git-askpass-helper.shsebagai:

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

dan kemudian jalankan git clone https://username@hostname/repodengan variabel lingkungan GIT_ASKPASS=/path/to/git-askpass-helper.shdan GIT_PASSWORD=nuclearlaunchcodes.

Ini memiliki keuntungan bahwa kata sandi tidak akan terlihat dalam daftar proses juga.

Intgr
sumber
+1 untuk solusi kreatif. Ini akan menjadi sedikit lebih aman daripada git pullsolusi dan memungkinkan Anda untuk menyimpan kata sandi plaintext sebagai rahasia di alat pilihan penyebaran otomatis Anda.
FGreg
13

Anda dapat memasukkan kredit koneksi Anda di ~/.netrcfile Anda . Sesuatu di sepanjang garis:

machine host.example.net
login bart
password eatmyshorts

Pastikan untuk chmod file itu ke 600. Jika Anda menggunakan windows, tautan berikut mungkin berguna: https://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on- windows-to-save-user-and-password

Secara pribadi, saya memiliki kecenderungan untuk menggunakan kunci SSH untuk tujuan auth (jika Anda diizinkan, tentu saja).

Brett Levene
sumber
Nah, ini akan meninggalkan kata sandi saya di dalam ~ / .netrc. Saya juga tidak mau itu.
Nathan
2

Setelah mempelajari puluhan posting SO, blog, dll, saya mencoba setiap metode, dan inilah yang saya hasilkan. Ini mencakup semuanya.

Lihat Lembar Chit Kredensial & Paket Privat

Ini semua cara dan alat yang dengannya Anda dapat mengotentikasi git dengan aman untuk mengkloning repositori tanpa prompt kata sandi interaktif .

  • Kunci Publik SSH
    • SSH_ASKPASS
  • Token Akses API
    • GIT_ASKPASS
    • .gitconfig sebagai gantinya
    • .gitconfig [kredensial]
    • .git-kredensial
    • .netrc
  • Bonus: Bekerja dengan Paket Pribadi
    • node / npm package.json
    • persyaratan python / pip / telur
    • permata ruby ​​Gemfile
    • golang go.mod

Opsi terbaik tanpa penyimpanan plaintext

Dari apa yang ditanyakan di sini, SSH Keys GIT_ASKPASS,, atau git credential storemenggunakan manajer Keychain OS mungkin merupakan pilihan terbaik.

Karena GIT_ASKPASS mungkin adalah yang paling sedikit dipahami dari 3, saya akan menjelaskannya di sini - dan yang lainnya ada di lembar contekan.

GIT_ASKPASS

Cara membuat GIT_ASKPASSskrip:

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

Bagaimana cara menggunakannya:

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

Script menerima stdin dalam bentuk:

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

Script menerima Git ENVs seperti:

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

Lebih detail di lembar contekan .

CoolAJ86
sumber