การกำหนดค่า Git ผ่าน SSH เพื่อเข้าสู่ระบบหนึ่งครั้ง


196

ฉันได้โคลนที่เก็บคอมไพล์ของฉันมากกว่า ssh ดังนั้นทุกครั้งที่ฉันสื่อสารกับผู้ให้กำเนิดโดยการกดหรือดึงฉันต้องป้อนรหัสผ่านอีกครั้ง ฉันจะกำหนดค่า git ได้อย่างไรโดยที่ฉันไม่จำเป็นต้องใส่รหัสผ่านหลาย ๆ ครั้ง?


7
ดูเหมือนว่าปัญหาด้านความปลอดภัยคุณไม่จำเป็นต้องใช้รหัสผ่านใด ๆ ในการทำคอมมิทปกติ แต่การกดเป็นประเภทของสิ่งที่คุณต้องการรับรองความถูกต้องอีกครั้ง แต่บางทีฉันก็ล้าสมัยไปแล้ว
Alex Sexton

คำตอบ:


104

ลองssh-addคุณssh-agentจะต้องเรียกใช้และถือกุญแจส่วนตัวของคุณ

(ตกลงตอบสนองต่อคำถามที่ได้รับการปรับปรุงก่อนอื่นคุณssh-keygenต้องสร้างกุญแจสาธารณะและกุญแจส่วนตัวตามที่Jefromi อธิบายไว้คุณวางกุญแจสาธารณะไว้บนเซิร์ฟเวอร์คุณควรใช้วลีรหัสผ่านถ้าคุณไม่มีข้อความเทียบเท่า รหัสผ่านข้อความในคีย์ส่วนตัวของคุณ แต่เมื่อคุณทำแล้วคุณต้องเป็นเรื่องจริงssh-agentตามที่อธิบายไว้ด้านล่าง)

คุณต้องการที่จะทำงานssh-agentในพื้นหลังขณะที่คุณเข้าสู่ระบบเมื่อคุณเข้าสู่ระบบความคิดคือการทำงานssh-addครั้งเดียวและครั้งเดียวเพื่อให้ตัวแทนข้อความรหัสผ่านของคุณเพื่อถอดรหัสคีย์ของคุณ ตัวแทนก็จะอยู่ในหน่วยความจำโดยปลดล็อคและโหลดกุญแจของคุณพร้อมใช้ทุกครั้งที่คุณอยู่

คำสั่ง ssh-family ทั้งหมด1จะปรึกษาตัวแทนและสามารถใช้งานไพรเวตคีย์ของคุณได้โดยอัตโนมัติ

ใน OSX (err, macOS ), GNOME และระบบ KDE ssh-agentมักจะเปิดตัวโดยอัตโนมัติสำหรับคุณ ฉันจะไปดูรายละเอียดในกรณีเช่นฉันคุณมี Cygwin หรือสภาพแวดล้อมหน้าต่างอื่น ๆ ที่แน่นอนที่สุดนี้ไม่ได้ทำเพื่อคุณ

เริ่มที่นี่: man ssh-agent.

มีหลายวิธีในการเรียกใช้ตัวแทนโดยอัตโนมัติ ดังที่หน้า man อธิบายคุณสามารถเรียกใช้เพื่อให้เป็นพาเรนต์ของกระบวนการอื่น ๆ ของเซสชันการเข้าสู่ระบบทั้งหมดของคุณ ด้วยวิธีนี้ตัวแปรสภาพแวดล้อมที่มีให้จะอยู่ในเชลล์ของคุณโดยอัตโนมัติ เมื่อคุณ (ต่อมา) เรียกใช้ssh-addหรือsshทั้งสองจะสามารถเข้าถึงตัวแทนเพราะพวกเขาทั้งหมดมีตัวแปรสภาพแวดล้อมที่มีชื่อพา ธ ซ็อกเก็ตมายากลหรืออะไรก็ตาม

หรือคุณสามารถรันเอเจนต์เป็นชายด์ธรรมดาบันทึกการตั้งค่าสภาพแวดล้อมในไฟล์และซอร์สไฟล์นั้นในทุกเชลล์เมื่อเริ่มทำงาน

ระบบ OSX และ Ubuntu ของฉันทำการตั้งค่าการเปิดตัวตัวแทนโดยอัตโนมัติดังนั้นสิ่งที่ฉันต้องทำคือเรียกใช้ssh-addเพียงครั้งเดียว ลองเรียกใช้ssh-addและดูว่าใช้งานได้หรือไม่หากเป็นเช่นนั้นคุณจำเป็นต้องทำหนึ่งครั้งต่อการรีบูต

ระบบ Cygwin ของฉันต้องการมันด้วยตนเองดังนั้นฉันจึงทำสิ่งนี้ในของฉัน.profileและฉันมี.bashrcแหล่งที่มา.profile:

. .agent > /dev/null
ps -p $SSH_AGENT_PID | grep ssh-agent > /dev/null || {
        ssh-agent > .agent
        . .agent > /dev/null
}

.agentไฟล์จะถูกสร้างขึ้นโดยอัตโนมัติสคริปต์; มันมีคำจำกัดความตัวแปรสภาพแวดล้อมและการส่งออก ข้างต้นพยายามที่จะแหล่งไฟล์ps(1). agent แล้วพยายามตัวแทน หากไม่สามารถใช้งานได้จะเริ่มต้นตัวแทนและสร้างไฟล์ตัวแทนใหม่ นอกจากนี้คุณยังสามารถเรียกใช้ssh-addและถ้ามันล้มเหลวในการเริ่มต้นตัวแทน


1. และแม้แต่ในพื้นที่และระยะไกลsudoด้วยส่วนขยาย pam ที่ถูกต้อง


1
แทนที่จะหาแหล่งผลิตจากssh-agentมันอาจจะมีผู้ใช้:eval `ssh-agent`
scottsome

288

พบปัญหาที่คล้ายกันกับ GitHub เพราะฉันใช้โปรโตคอล HTTPS หากต้องการตรวจสอบว่าคุณใช้โปรโตคอลใดอยู่

git config -l

remote.origin.urlและดูที่บรรทัดที่เริ่มต้นด้วย เพื่อสลับโปรโตคอลของคุณ

git config remote.origin.url git@github.com:your_username/your_project.git

13
ฉันคิดว่านี่น่าจะเป็นคำตอบอย่างเป็นทางการ ^ 5 @Muein!
Fer Martin

14
สิ่งนี้ไม่ทำงานเมื่อ repo เป็นส่วนตัวและคุณไม่ใช่เจ้าของ ฉันเพิ่งประสบกับPermission deniedข้อผิดพลาด
ogzd

7
นี่สำหรับ repo หนึ่งเท่านั้นฉันจะทำให้มันเป็นสากลได้อย่างไร
onmyway133

2
@ogzd GitHub (หรือบริการใด ๆ ที่คุณใช้งานอยู่) ต้องการคีย์ SSH สาธารณะก่อนที่จะใช้งานได้ แต่นี่ก็ยังคงเป็นโซลูชันที่ถูกต้อง
MattM

ทางเลือกคือgit remote set-url origin git@github.com:your_username/your_project.git
icosamuel

25

นี่คือการกำหนดค่า ssh ไม่ใช่ git หากคุณยังไม่ได้ทำคุณควรใช้ssh-keygen(พร้อมข้อความรหัสผ่านเปล่า) เพื่อสร้างคู่กุญแจ ssh-copy-idจากนั้นคุณสามารถคัดลอกคีย์สาธารณะไปยังปลายทางระยะไกลด้วย ถ้าคุณไม่จำเป็นต้องใช้หลาย ๆ ปุ่ม (เช่นอันที่ปลอดภัยกว่าพร้อมวลีรหัสผ่านเพื่อวัตถุประสงค์อื่น ๆ ) หรือคุณมีสิ่งที่เป็นเอกลักษณ์หลายอย่างที่แปลก ๆ เกิดขึ้นมันง่ายมาก:

ssh-keygen   # enter a few times to accept defaults
ssh-copy-id -i ~/.ssh/id_rsa user@host

แก้ไข: คุณควรจริงๆเพียงแค่อ่านคำตอบ DigitalRoss แต่ถ้าคุณใช้คีย์ที่มีวลีรหัสผ่านที่คุณจะต้องใช้ssh-add <key-file>เพื่อเพิ่มไปยังssh-agent(และเห็นได้ชัดว่าเริ่มต้นขึ้นssh-agentถ้าการกระจายของคุณไม่ได้มีหนึ่งในการทำงานสำหรับคุณ)


2
ฉันไม่แน่ใจว่านี่เป็นคำตอบของคำถามเขาต้องทำไปแล้วมิฉะนั้นเขาจะไม่สามารถเข้าถึงไซต์ได้ คำตอบที่เขาต้องการคือ: ssh-agentในขณะที่เขาต้องการหลีกเลี่ยงปัญหาการใส่รหัสผ่านทุกครั้ง ไม่ downvoting แต่ฉันคิดว่าคุณจำเป็นต้องปรับปรุงคำตอบนี้เว้นแต่ว่าฉันเป็นคนที่เข้าใจผิด ...
DigitalRoss

2
@DigitalRoss: อ่าฉันไม่แน่ใจในการอ่านคำถามว่า OP จริง ๆ มีการตั้งค่าคีย์ คุณอาจพูดถูกและฉันพยายามแนะนำไม่ให้ใช้ข้อความรหัสผ่าน ssh-agentอย่างไรก็ตามคุณของหลักสูตรที่เหมาะสมเกี่ยวกับ +1 ถึงคุณ!
Cascabel

ฉันสับสนว่าฉันต้องใช้ ssh-keygen หรือ ssh-add ในไดเรกทอรี ~ / .ssh / ของฉันฉันมีเพียงสองไฟล์: config และ known_hosts ดูเหมือนว่า ssh-add ต้องการไฟล์อื่น ~ / .ssh / id_rsa ฉันควรสร้างไฟล์นั้นก่อนโดยใช้ ssh-keygen ตามที่ @Jefromi อธิบาย?
reprogrammer

ใช่คุณต้องสร้างรหัสก่อนจึงจะสามารถคัดลอกไปยังเซิร์ฟเวอร์ระยะไกลได้ ฉันคิดว่าบางทีเราอาจสับสนกับการใช้คำว่า "passphrase" ของคุณ - นั่นคือสิ่งที่ssh-*เรียกว่า passphrase ที่จำเป็นในการใช้คีย์ - ซึ่งคุณหมายถึงรหัสผ่านจริงของผู้ใช้บนรีโมต?
Cascabel

ใช่ฉันควรจะบอกรหัสผ่านแทนข้อความรหัสผ่าน
reprogrammer

23

ตรวจสอบให้แน่ใจว่าเมื่อคุณโคลนที่เก็บคุณทำกับ SSH URL ไม่ใช่ HTTPS ในกล่อง URL โคลนของ repo เลือกโปรโตคอล SSH ก่อนที่จะคัดลอก URL ดูภาพด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่


23

หากคุณโคลนโดยใช้HTTPS (แนะนำ) ดังนั้น: -

git config --global credential.helper cache

แล้ว

git config --global credential.helper 'cache --timeout=2592000'
  • หมดเวลา = 2592000 (30 วันในไม่กี่วินาที) เพื่อเปิดใช้งานการแคชเป็นเวลา 30 วัน (หรือชุดใดก็ตามที่คุณ)

  • ตอนนี้รันคำสั่ง git แบบง่ายที่ต้องการชื่อผู้ใช้และรหัสผ่าน

  • ป้อนข้อมูลรับรองของคุณหนึ่งครั้งและตอนนี้แคชถูกเปิดใช้งานเป็นเวลา 30 วัน

  • ลองอีกครั้งด้วยคำสั่ง git และตอนนี้คุณไม่จำเป็นต้องมีข้อมูลรับรองใด ๆ

  • สำหรับข้อมูลเพิ่มเติม: - แคชรหัสผ่าน GitHub ของคุณใน Git

หมายเหตุ : คุณต้องใช้ Git 1.7.10 ขึ้นไปเพื่อใช้ตัวช่วยข้อมูลประจำตัว เมื่อรีสตาร์ทระบบเราอาจต้องป้อนรหัสผ่านอีกครั้ง


1
คุณเป็นผู้กอบกู้เบื่อพิมพ์รหัสผ่านชื่อผู้ใช้ทุกครั้ง ขอบคุณ :)
Dave Ranjan

โปรดระบุว่าสิ่งนี้มีไว้สำหรับ Linux เท่านั้นหรือ Windows เท่านั้นหรือทั้งสองอย่าง
joedotnot

@joedotnot สำหรับระบบปฏิบัติการทั้งหมด คุณยังสามารถเรียกดูลิงค์ที่กล่าวถึงแล้วคุณจะพบตัวเลือกระบบปฏิบัติการอยู่ด้านล่างของส่วนหัว
Nishant Thapliyal

นี้! ทำงานได้ในทุกกรณี
Akaisteph7

@Charles สวัสดีฉันเพิ่งทดสอบแบบเดิมและใช้งานได้ตามที่คาดไว้
Nishant Thapliyal

8

ขยายความคิดของ Muein สำหรับผู้ที่ต้องการแก้ไขไฟล์โดยตรงผ่านการรันคำสั่งใน git-bash หรือเทอร์มินัล

ไปที่ไดเรกทอรี. git ของโครงการ (รูทโปรเจ็กต์ในเครื่องของคุณ) แล้วเปิดไฟล์ 'config' จากนั้นค้นหา [remote "origin"] และตั้งค่า url ดังนี้:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = git@github.com:<username>/<projectname>.git

1
สิ่งนี้ช่วยได้จริงๆ วิธีที่ปลอดภัยและสะอาดในการแก้ไขปัญหา ฉันคิดว่าบางคนควรปรับปรุงคำตอบของ Muein กับสิ่งนี้
Luis Ortega Araneda

1
"ไปที่ไดเรกทอรี. git ของโครงการ" ลองครั้งแรก
2560

รับข้อผิดพลาดนี้ "ร้ายแรง: ฉันไม่ได้จัดการโปรโตคอล" git@github.com: <username> / https '"
Shivam Bharadwaj

@ShivamBharadwaj ค้นหาอย่างรวดเร็วเปิดเผยหัวข้อนี้stackoverflow.com/questions/30474447/... มีความเป็นไปได้ไหมที่คุณกำลังคัดลอกคำสั่ง git clone จากบางเว็บไซต์และพบปัญหานี้? ถ้าใช่ให้ลองพิมพ์คำสั่งสมบูรณ์แทน
uchamp

6

ฉันคิดว่ามีสองสิ่งที่แตกต่างกันที่นี่ อันแรกก็คือการรับรองความถูกต้อง SSH ปกติต้องการให้ผู้ใช้ใส่รหัสผ่านของบัญชี (ที่รหัสผ่านบัญชีจะได้รับการรับรองความถูกต้องกับวิธีการที่แตกต่างกันขึ้นอยู่กับการกำหนดค่า sshd)

คุณสามารถหลีกเลี่ยงการใส่รหัสผ่านนั้นโดยใช้ใบรับรอง ด้วยใบรับรองคุณยังต้องใส่รหัสผ่าน แต่คราวนี้เป็นรหัสผ่านของรหัสส่วนตัวของคุณ (ซึ่งไม่ขึ้นอยู่กับรหัสผ่านของบัญชี)

ในการทำเช่นนี้คุณสามารถทำตามคำแนะนำที่ steveth45:

ด้วยการตรวจสอบคีย์สาธารณะ

หากคุณต้องการหลีกเลี่ยงการใส่รหัสผ่านใบรับรองทุกครั้งคุณสามารถใช้ ssh-agent ดังที่ DigitalRoss ระบุไว้

วิธีที่แน่นอนที่คุณทำขึ้นอยู่กับ Unix vs Windows แต่โดยพื้นฐานแล้วคุณจำเป็นต้องเรียกใช้ ssh-agent ในพื้นหลังเมื่อคุณเข้าสู่ระบบและจากนั้นเป็นครั้งแรกที่คุณเข้าสู่ระบบเรียกใช้ ssh-add เพื่อให้ตัวแทนข้อความรหัสผ่านของคุณ คำสั่ง ssh-family ทั้งหมดจะปรึกษาตัวแทนและรับข้อความรหัสผ่านของคุณโดยอัตโนมัติ

เริ่มที่นี่: man ssh-agent

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

ด้วยKeychainคุณสามารถทำสิ่งเดียวกันกับ ssh-agent แต่ "system-wide" เมื่อคุณเปิดคอมพิวเตอร์คุณจะเปิดเปลือกและใส่รหัสผ่านของใบรับรอง จากนั้นเชลล์อื่น ๆ จะใช้ใบรับรอง "ที่โหลด" และรหัสผ่านของคุณจะไม่ถูกถามอีกจนกว่าคุณจะรีสตาร์ทพีซี

Gnome มีแอปพลิเคชันที่คล้ายกันเรียกว่าGnome Keyringซึ่งจะขอรหัสผ่านใบรับรองของคุณในครั้งแรกที่คุณใช้และจากนั้นจะเก็บมันไว้อย่างปลอดภัยดังนั้นคุณจะไม่ถูกถามอีก


ฉันใช้พวงกุญแจตัวเอง: มีประโยชน์มาก
Jakub Narębski

มีอีกวิธีหนึ่งในการเขียนAddKeysToAgent yesใน. ssh / config โหลดแล้วในหน่วยความจำจนกว่าคุณจะปิดคอมพิวเตอร์
infoclogged


4
ssh-keygen -t rsa

เมื่อถามวลีรหัสผ่านให้เว้นว่างไว้เช่นเพียงกด Enter ง่ายเหมือนที่ !!


4
โปรดระวังว่าถ้าคุณทำเช่นนี้ใครก็ตามที่มีสิทธิ์เข้าถึงไคลเอ็นต์การพัฒนาของคุณจะสามารถเข้าถึงเซิร์ฟเวอร์ที่เก็บข้อมูลได้โดยไม่ต้องใช้รหัสผ่าน คอมโบ ssh-agent / ssh-add ให้ความปลอดภัยที่ดีขึ้นมาก
Peter V. Mørch

3

ลองสิ่งนี้จากกล่องที่คุณกด

    ssh git@github.com

จากนั้นคุณควรได้รับการตอบรับจาก GitHub และจะไม่เป็นไร


2
มันใช้งานได้สำหรับฉันHi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.แต่อย่างใดคอมไพล์ยังคงถามรหัสผ่านเมื่อฉันพยายามที่จะผลักดัน
gkucmierz

2

ฉันต้องโคลน repo git จากเซิร์ฟเวอร์ที่ไม่อนุญาตให้เข้าสู่ระบบ vie ssh สำคัญ แต่ด้วยผู้ใช้ / รหัสผ่าน ฉันไม่พบวิธีการกำหนดค่าปลั๊กอิน Git เพื่อใช้การรวมผู้ใช้ / รหัสผ่านอย่างง่ายดังนั้นฉันจึงเพิ่มคำสั่งเชลล์ต่อไปนี้เป็นขั้นตอนการสร้างล่วงหน้าบนเครื่องสร้างลินุกซ์ซึ่งขึ้นอยู่กับเครื่องมือที่คาดหวัง

นี่ไม่ใช่วิธีที่ดีในการแก้ไขปัญหานี้ตามรหัสผ่านของคุณที่แสดงให้เห็นว่าข้อความที่ชัดเจนในการกำหนดค่าและบันทึกของ JENKINS JOB! ใช้งานเฉพาะในกรณีที่ไม่มีวิธีกำหนดค่าการยืนยันคีย์ RSA-KEY หรือการกำหนดค่าอื่น ๆ !

rm -rf $WORKSPACE &&
expect -c 'set timeout -1; spawn git clone USER@MYHOST:/MYPATH/MYREPO.git $WORKSPACE; expect "password:" {send "MYPASSWORD\r"}; expect eof'

1

เพิ่มบรรทัดเดียวAddKeysToAgent yesที่ด้านบนของไฟล์. ssh / config Ofcourse ssh-agent ต้องทำงานล่วงหน้า ถ้ามันไม่ทำงาน (ตรวจสอบโดยprep ssh-agent) แล้วก็เรียกใช้มันeval $(ssh-agent)

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

แหล่งที่มาของการแก้ปัญหาคือ/ubuntu/362280/enter-ssh-passphrase-once/853578#853578


0

ฉันพยายามหลีกเลี่ยงการพิมพ์ข้อความรหัสผ่านตลอดเวลาเพราะฉันใช้ ssh บน windows สิ่งที่ฉันทำคือแก้ไขไฟล์. profile ของฉันดังนั้นฉันจึงป้อนรหัสผ่านของฉันลงในเซสชันที่ต้องการ ดังนั้นนี่คือส่วนของรหัส:

    SSH_ENV="$HOME/.ssh/environment"

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
        echo succeeded
        chmod 600 "$SSH_ENV"
        . "$SSH_ENV" > /dev/null
        ssh-add
    }

    # test for identities
    function test_identities {
        # test whether standard identities have been added to the agent already
        ssh-add -l | grep "The agent has no identities" > /dev/null
        if [ $? -eq 0 ]; then
            ssh-add
            # $SSH_AUTH_SOCK broken so we start a new proper agent
            if [ $? -eq 2 ];then
                start_agent
            fi
        fi
    }

    # check for running ssh-agent with proper $SSH_AGENT_PID
    if [ -n "$SSH_AGENT_PID" ]; then
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
      test_identities
        fi
    # if $SSH_AGENT_PID is not properly set, we might be able to load one from
    # $SSH_ENV
    else
        if [ -f "$SSH_ENV" ]; then
      . "$SSH_ENV" > /dev/null
        fi
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
            test_identities
        else
            start_agent
        fi
    fi

ดังนั้นเมื่อฉันพิมพ์ข้อความรหัสผ่านของฉันหนึ่งครั้งในเซสชัน ..


-1

ฉันลองใช้คำแนะนำเหล่านี้และอื่น ๆ อีกมากมายดังนั้นฉันจึงสามารถคอมไพล์โคลนจากอินสแตนซ์ AWS ของฉันได้ ไม่มีอะไรทำงาน ในที่สุดฉันก็โกงออกจากความสิ้นหวัง: ฉันคัดลอกเนื้อหาของ id_rsa.pub บนเครื่องท้องถิ่นของฉันและผนวกเข้ากับ ~ / .ssh / known_hosts บนอินสแตนซ์ AWS ของฉัน


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