วิธีมอบชื่อผู้ใช้ / รหัสผ่านให้กับ git clone ในสคริปต์ แต่ไม่เก็บข้อมูลรับรองไว้ใน. git / config


31

ฉันกำลังโคลนที่เก็บ git ในสคริปต์เช่นนี้

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

ใช้งานได้ แต่ชื่อผู้ใช้และรหัสผ่านของฉัน! จะถูกเก็บไว้ในขณะนี้ใน URL .git/configกำเนิดใน

ฉันจะป้องกันได้อย่างไร แต่ยังคงทำในสคริปต์ (ดังนั้นไม่มีการป้อนรหัสผ่านด้วยตนเอง)


คุณสามารถอัปเดตที่มาได้ในภายหลัง:git remote set-url origin https://host.com/name/.git
ceejayoz

@ceejayoz ใช่มันเป็นไปได้ ขอบคุณสำหรับความคิด ฉันยังคงหวังหาวิธีแก้ปัญหาที่ไม่ได้จัดเก็บข้อมูลรับรองชั่วคราว
นาธาน

4
แน่นอน - ใช้การรับรองความถูกต้องตาม SSH ด้วยคีย์
ceejayoz

2
มีเหตุผลที่คุณใช้ https แทน SSH หรือไม่ SSH รองรับคีย์
mzhaase

ฉันเข้าใจคำถาม แต่ทำไมคุณถึงดีกับรหัสผ่านที่จัดเก็บไว้ในสคริปต์? นั่นไม่ดีเท่ากัน
Martijn Courteaux

คำตอบ:


20

วิธีการที่ฉันใช้คือการใช้จริงgit pullแทนการโคลน สคริปต์จะมีลักษณะดังนี้:

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

นี่จะไม่เก็บชื่อผู้ใช้หรือรหัสผ่านของ.git/configคุณ อย่างไรก็ตามหากไม่มีการดำเนินการขั้นตอนอื่นชื่อผู้ใช้และรหัสผ่านแบบธรรมดาจะสามารถมองเห็นได้ในขณะที่กระบวนการกำลังทำงานจากคำสั่งที่แสดงกระบวนการปัจจุบัน (เช่นps)

อีกหนึ่งข้อเสนอแนะที่ฉันจะทำ (ถ้าคุณไม่สามารถใช้ ssh) คือการใช้โทเค็น OAuth แทนชื่อผู้ใช้ / รหัสผ่านธรรมดา ๆ เพราะมันปลอดภัยกว่าเล็กน้อย คุณสามารถสร้าง OAuth โทเค็นจากการตั้งค่าโปรไฟล์ของคุณ: https://github.com/settings/tokens

จากนั้นใช้โทเค็นนั้นคำสั่ง pull จะเป็น

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

ฉันไม่สามารถใช้โทเค็น auth ได้ ฉันไม่ได้ใช้ GitHub แต่เป็นเซิร์ฟเวอร์ส่วนตัว
นาธาน

3
ก็ควรจะตั้งข้อสังเกตว่าชื่อผู้ใช้และรหัสผ่านจะอยู่ในที่มองเห็นได้เช่นpsในขณะที่ดึงวิ่ง (อย่างน้อยจนกว่าคุณจะได้ป้องกันไม่ให้ผู้ใช้เห็นกระบวนการของแต่ละคน)
derobert

คะแนนสำหรับคำสาบาน มันเป็นสิ่งที่ฉันต้องการในการผลิต / การจัดเตรียม / พัฒนา
RobotHumans

ล้านขอบคุณเพื่อนคุณ สูญเปล่าชั่วโมงและชั่วโมง n ในที่สุดคำตอบของคุณมา resue : thumbsup
JasdeepSingh

17

IMO ทางออกที่ดีที่สุดคือการใช้ตัวGIT_ASKPASSช่วยที่กำหนดเองและส่งรหัสผ่านเป็นตัวแปรสภาพแวดล้อมอื่น ตัวอย่างเช่นสร้างไฟล์git-askpass-helper.shเป็น:

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

และเรียกใช้แล้วgit clone https://username@hostname/repoกับตัวแปรสภาพแวดล้อมและGIT_ASKPASS=/path/to/git-askpass-helper.shGIT_PASSWORD=nuclearlaunchcodes

นี่คือข้อดีที่รหัสผ่านจะไม่ปรากฏในรายการกระบวนการด้วย


+1 สำหรับโซลูชันสร้างสรรค์ นี่จะปลอดภัยกว่าgit pullโซลูชันเล็กน้อยและให้คุณจัดเก็บรหัสผ่านแบบธรรมดาเป็นความลับในเครื่องมือปรับใช้อัตโนมัติที่คุณเลือก
FGreg

13

คุณสามารถป้อนเครดิตการเชื่อมต่อของคุณใน~/.netrcไฟล์ของคุณ บางสิ่งบางอย่างตาม:

machine host.example.net
login bart
password eatmyshorts

เพียงตรวจสอบให้แน่ใจว่า chmod ไฟล์นั้นเป็น 600 หากคุณใช้ windows ลิงก์ต่อไปนี้อาจเป็นประโยชน์: https://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on- หน้าต่างการบันทึกของผู้ใช้และรหัสผ่าน

โดยส่วนตัวฉันมีแนวโน้มที่จะใช้กุญแจ SSH เพื่อวัตถุประสงค์ในการรับรองความถูกต้อง (ถ้าคุณได้รับอนุญาต)


ก็จะปล่อยให้รหัสผ่านของฉันอยู่ใน ฉันยังไม่ต้องการที่
นาธาน

2

หลังจากไปกว่าหลายสิบโพสต์ SO, บล็อก, ฯลฯ ผมพยายามออกทุกวิธีและนี่คือสิ่งที่ฉันมาด้วย ครอบคลุมทุกอย่าง

ดูเอกสารรับรอง Git & แพคเกจส่วนตัว

เหล่านี้ล้วนเป็นวิธีการและเครื่องมือที่คุณสามารถรับรองความถูกต้องปลอดภัยคอมไพล์ที่จะโคลนพื้นที่เก็บข้อมูลได้โดยไม่ต้องใส่รหัสผ่านของการโต้ตอบพร้อมท์

  • คีย์สาธารณะ SSH
    • SSH_ASKPASS
  • โทเค็นการเข้าถึง API
    • GIT_ASKPASS
    • .gitconfig แทนของ
    • .gitconfig [หนังสือรับรอง]
    • .git-ข้อมูลประจำตัว
    • .netrc
  • โบนัส: ทำงานร่วมกับแพ็คเกจส่วนตัว
    • node / npm package.json
    • ข้อกำหนดของ python / pip / eggs.txt
    • อัญมณีพลอยทับทิม
    • golang go.mod

ตัวเลือกที่ดีที่สุดสำหรับการไม่มีที่เก็บข้อความธรรมดา

จากสิ่งที่ถามที่นี่ทั้งคีย์ SSH GIT_ASKPASSหรือการgit credential storeใช้ตัวจัดการพวงกุญแจ OS อาจเป็นตัวเลือกที่ดีที่สุด

เนื่องจาก GIT_ASKPASS น่าจะเป็นที่เข้าใจน้อยที่สุดของ 3 ฉันจะให้รายละเอียดที่นี่ - และคนอื่น ๆ อยู่ในสูตร

GIT_ASKPASS

วิธีสร้างGIT_ASKPASSสคริปต์:

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

วิธีใช้งาน:

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

สคริปต์รับ stdin ในรูปแบบของ:

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

สคริปต์ได้รับ ENV ของ Git เช่น:

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

รายละเอียดเพิ่มเติมในcheatsheet

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.