บัญชี GitHub หลายบัญชี & การกำหนดค่า SSH


249

ฉันมีปัญหาในการรับคีย์ SSH สองแบบ / บัญชี GitHub เพื่อเล่นด้วยกันได้ดี ฉันมีการตั้งค่าต่อไปนี้:

Repos สามารถเข้าถึงได้จากหนึ่งบัญชีโดยใช้ git@github.com:accountname

Repos สามารถเข้าถึงได้จากบัญชีอื่นโดยใช้ git@github.com:anotheraccount

แต่ละบัญชีมีรหัส SSH ของตัวเอง เพิ่มทั้งสองคีย์ SSH แล้วและฉันสร้างไฟล์ปรับแต่งแล้ว ฉันไม่เชื่อว่าไฟล์ปรับแต่งนั้นถูกต้อง ฉันไม่แน่ใจว่าจะระบุ repos ที่เข้าถึงโดยใช้git@github.com:accountnameควรใช้id_rsaและgit@github.com:anotheraccountควรใช้id_rsa_anotheraccountอย่างไร


ฉันพบว่าลิงก์นี้มีประโยชน์medium.freecodecamp.org/
jgreen

ฉันมีตัวตน SSH 3 แบบแยกกันใน ~ / .ssh / config เซิร์ฟเวอร์สำหรับโรงเรียนมีรหัสผ่าน 2 สำหรับบัญชี GitHub ที่ทำงาน / ส่วนตัวแยกกันไม่ได้ การทำงานgit pullล้มเหลวและขอรหัสผ่านของโรงเรียนแม้จะมีไฟล์ Identity ที่แยกจากกัน "IdentitiesOnly = ใช่" แยกโดเมนและชื่อโฮสต์ทั้งหมดที่มีอยู่ในssh-add -l... คีย์ uni เป็น 'แรก' โดยไม่คำนึงถึงการตั้งค่านั้น ต้องย้ายส่วนที่อยู่ด้านล่างของคนอื่น ๆ ใน. ssh / config และตอนนี้git pullจากทั้งสองบัญชี GitHub ประสบความสำเร็จโดยไม่ต้องขอรหัสผ่าน unsh ssh
mc01

คำตอบ:


309

คำตอบของ Andy Lester นั้นถูกต้อง แต่ฉันพบขั้นตอนพิเศษที่สำคัญที่ฉันต้องทำเพื่อให้มันทำงานได้ ในการพยายามตั้งค่าโปรไฟล์สองโปรไฟล์หนึ่งโปรไฟล์สำหรับส่วนตัวและอีกโปรไฟล์สำหรับทำงานฉัน~/.ssh/configมีดังนี้:

Host me.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/me_rsa

Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/work_rsa

ssh-add ~/.ssh/work_rsaรายละเอียดการทำงานของฉันไม่ได้ใช้จนฉันได้ หลังจากนั้นการเชื่อมต่อกับ GitHub ใช้โปรไฟล์ที่ถูกต้อง ก่อนหน้านี้พวกเขาเริ่มต้นเป็นรหัสสาธารณะแรก

สำหรับไม่สามารถเปิดการเชื่อมต่อกับตัวแทนการตรวจสอบสิทธิ์ของคุณเมื่อใช้งานssh-addให้
ตรวจสอบ: https://stackoverflow.com/a/17695338/1760313


39
ขอบคุณ! - ssh-addนั่นคือสิ่งที่ฉันคิดถึง
ปราชญ์

ด้วยการใช้ ssh-add ฉันเห็นว่าฉันไม่ได้รับอนุญาตให้ตั้งค่าคีย์อย่างถูกต้อง เมื่อฉันแก้ไขทุกอย่างที่ทำงาน ขอบคุณมาก!
phatmann

6
ดูยังdoblock.com/articles/... ข้อมูลใหม่ที่สำคัญคือคุณอาจต้องเพิ่มชื่อผู้ใช้ ("งาน" ในตัวอย่างนี้) ไปยังชื่อโฮสต์ใน URL ระยะไกลเช่น git@work.github.com: work / my_repo.git (เช่น ตรงข้ามกับ "git@github.com ... ")
BobS


15
ในการแก้ไขปัญหาที่ "ค่าเริ่มต้นเป็นรหัสสาธารณะแรก" ให้เพิ่มIdentitiesOnly yesในHost *ส่วนของ~/.ssh/configไฟล์ของคุณ สิ่งนี้บอกให้ ssh ใช้ IdentityFiles ที่คุณระบุจริง ๆ แทนที่จะสแปมเซิร์ฟเวอร์ด้วยทั้งหมด
หอยทากวิศวกรรม

172

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


ขั้นตอนที่ 1: ปุ่ม ssh
สร้างคู่กุญแจที่คุณต้องการ ในตัวอย่างนี้ฉันตั้งชื่อฉันเป็นค่าเริ่มต้น / ต้นฉบับ 'id_rsa' (ซึ่งเป็นค่าเริ่มต้น) และรายการใหม่ของฉันคือ 'id_rsa-work':

ssh-keygen -t rsa -C "stefano@work.com"


ขั้นตอนที่ 2: การตั้งค่า SSH
ตั้งค่าโปรไฟล์ SSH หลายโดยการสร้าง / แก้ไข~ / .ssh / config บันทึกค่า 'โฮสต์' ที่ต่างกันเล็กน้อย:

# Default GitHub
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

# Work GitHub
Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_work


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

$ ssh-add -l
2048 1f:1a:b8:69:cd:e3:ee:68:e1:c4:da:d8:96:7c:d0:6f stefano (RSA)
2048 6d:65:b9:3b:ff:9c:5a:54:1c:2f:6a:f7:44:03:84:3f stefano@work.com (RSA)

หากรายการของคุณไม่มีให้เรียกใช้:

ssh-add ~/.ssh/id_rsa_work


ขั้นตอนที่ 4: ทดสอบ
เพื่อทดสอบว่าคุณทำทั้งหมดถูกต้องฉันขอแนะนำให้ตรวจสอบอย่างรวดเร็วต่อไปนี้:

$ ssh -T git@github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T git@work.github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

โปรดทราบว่าคุณจะต้องเปลี่ยนชื่อโฮสต์ (github / work.github) ขึ้นอยู่กับคีย์ / ข้อมูลระบุตัวตนที่คุณต้องการใช้ แต่ตอนนี้คุณควรจะไปดี! :)


1
นี่คือการตอบสนองที่ดี ฉันต้องใช้ ssh-add เพื่อเพิ่มทั้งสองคีย์ ssh เพื่อใช้ประโยชน์จากไฟล์ config .. ขอบคุณ :)
gaurav.singharoy

สิ่งเดียวที่ฉันต้องการเพิ่มคือเมื่อคุณเรียกใช้ ssh-keygen -t rsa มันจะให้ชื่อไฟล์เริ่มต้นที่คุณใส่ชื่อไฟล์ที่กำหนดเองของคุณ
Donato

หนึ่งในคำตอบที่ดีที่สุด วิดีโอนี้ยังช่วยฉันด้วย youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingWithArif

โพสต์ที่ดีจะดีถ้าโพสต์นี้รวมถึงการตั้งค่า git config ของคุณ 'อีเมล': help.github.com/articles/ …
วิศวกรเดฟ

43

สมมติว่าaliceเป็นผู้ใช้ github.com ที่มีที่เก็บส่วนตัว 2 แห่งขึ้นrepoNไป สำหรับตัวอย่างนี้เราจะทำงานกับที่เก็บเพียงสองชื่อrepo1และrepo2

https://github.com/alice/repo1

https://github.com/alice/repo2

คุณต้องดึงจากที่เก็บเหล่านี้โดยไม่ต้องป้อนรหัสผ่านที่อาจอยู่บนเซิร์ฟเวอร์หรือบนเซิร์ฟเวอร์หลายเครื่อง คุณต้องการทำgit pull origin masterตัวอย่างและคุณต้องการให้สิ่งนี้เกิดขึ้นโดยไม่ต้องขอรหัสผ่าน

คุณไม่ชอบการจัดการกับ ssh-agent คุณได้ค้นพบ (หรือคุณกำลังค้นพบในขณะนี้) เกี่ยวกับ~/.ssh/configไฟล์ที่ทำให้ไคลเอนต์ ssh ของคุณรู้ว่าคีย์ส่วนตัวใดที่จะใช้ขึ้นอยู่กับชื่อโฮสต์และชื่อผู้ใช้ นี้:

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

ดังนั้นคุณจึงไปข้างหน้าและสร้าง(alice_github.id_rsa, alice_github.id_rsa.pub)keypair ของคุณจากนั้นคุณก็ไปที่.git/configไฟล์ของที่เก็บของคุณและคุณแก้ไข url ของรีโมตของคุณoriginให้เป็นแบบนี้:

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

และในที่สุดคุณก็ไปที่ที่เก็บ Settings > Deploy keysส่วนและเพิ่มเนื้อหาของalice_github.id_rsa.pub

ณ จุดนี้คุณสามารถทำของคุณ git pull origin masterโดยไม่ต้องป้อนรหัสผ่านโดยไม่มีปัญหา

แต่ที่เก็บอันที่สองล่ะ

ดังนั้นสัญชาตญาณของคุณจะต้องคว้ากุญแจนั้นและเพิ่มเข้าไป repo2กุญแจของการปรับใช้ แต่ github.com จะผิดพลาดและบอกคุณว่ากุญแจนั้นถูกใช้ไปแล้ว

ตอนนี้คุณไปและสร้างรหัสอื่น (โดยssh-keygen -t rsa -C "alice@alice.com"ไม่ต้องใช้รหัสผ่าน) และเพื่อให้ไม่เป็นระเบียบคุณจะต้องตั้งชื่อคีย์ของคุณดังนี้:

  • repo1 keypair: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2 keypair: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

ตอนนี้คุณจะวางกุญแจสาธารณะใหม่ในrepo2การกำหนดค่าคีย์การปรับใช้ที่ github.com แต่ตอนนี้คุณมีปัญหา ssh ที่จะจัดการกับ

ssh จะบอกได้อย่างไรว่าจะใช้คีย์ใดถ้าที่เก็บโฮสต์อยู่ในgithub.comโดเมนเดียวกัน

.ssh/configไฟล์ของคุณชี้ไปที่github.comและไม่ทราบว่าจะใช้คีย์ใดเมื่อถึงเวลาที่ต้องทำการดึง

ดังนั้นฉันจึงพบเคล็ดลับกับ github.com คุณสามารถบอกไคลเอ็นต์ ssh ของคุณว่าที่เก็บข้อมูลแต่ละแห่งอยู่ในโดเมนย่อย github.com ที่แตกต่างกันในกรณีเหล่านี้พวกเขาจะrepo1.github.comและrepo2.github.com

ดังนั้นสิ่งแรกคือการแก้ไข.git/configไฟล์ใน repo clones ของคุณดังนั้นมันจะมีหน้าตาแบบนี้แทน:

สำหรับ repo1

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

สำหรับ repo2

[remote "origin"]
        url = "ssh://git@repo2.github.com/alice/repo2.git"

จากนั้นใน.ssh/configไฟล์ของคุณตอนนี้คุณจะสามารถป้อนการกำหนดค่าสำหรับแต่ละโดเมนย่อยได้ :)

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

Host repo2.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
  IdentitiesOnly yes

ตอนนี้คุณสามารถที่จะgit pull origin masterไม่ต้องป้อนรหัสผ่านใด ๆ จากที่เก็บทั้งสอง

หากคุณมีหลายเครื่องคุณสามารถคัดลอกคีย์ไปยังแต่ละเครื่องและนำมาใช้ซ้ำได้ แต่ฉันขอแนะนำให้ใช้เลกทำงานเพื่อสร้าง 1 คีย์ต่อเครื่องและ repo คุณจะมีปุ่มที่จะจัดการได้มากขึ้น แต่คุณจะมีความเสี่ยงน้อยลงหากมีใครถูกโจมตี


1
การระบุโดเมนย่อยที่ตรงกับโฮสต์.ssh/configเป็นขั้นตอนสำคัญ - ขอบคุณมากสำหรับสิ่งนั้น
Mike Miller

22

ฉันมี 2 บัญชีใน GitHub และนี่คือสิ่งที่ฉันทำ (ต่อlinux) เพื่อให้ใช้งานได้

คีย์

  • สร้างคีย์ rsa 2 คู่ผ่านssh-keygenตั้งชื่อให้ถูกต้องเพื่อให้ชีวิตง่ายขึ้น
  • เพิ่มกุญแจส่วนตัวให้ตัวแทนท้องถิ่นผ่าน ssh-add path_to_private_key
  • สำหรับแต่ละบัญชี Github ให้อัปโหลดรหัสสาธารณะ (ชัดเจน)

องค์ประกอบ

~ / .ssh / config

Host github-kc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_kc.pub
    # LogLevel DEBUG3

Host github-abc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_abc.pub
    # LogLevel DEBUG3

ตั้งค่า URL ระยะไกลสำหรับ repo:

  • สำหรับ repo ใน Host github-kc:

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • สำหรับ repo ใน Host github-abc:

    git remote set-url origin git@github-abc:abcdefg/yyy.git
    

ชี้แจง

ตัวเลือกใน~/.ssh/config:

  • Hostgithub- <identify_specific_user>
    โฮสต์อาจเป็นค่าใด ๆ ที่สามารถระบุโฮสต์และบัญชีได้โดยไม่จำเป็นต้องเป็นโฮสต์จริงเช่น github-kcระบุหนึ่งในบัญชีของฉันบน github สำหรับแล็ปท็อปท้องถิ่นของฉัน

    เมื่อตั้งค่า URL ระยะไกลสำหรับ repo git นี่คือค่าที่จะใส่git@นั่นคือวิธีที่ repo จับคู่กับโฮสต์เช่นgit remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [ต่อไปนี้เป็นตัวเลือกย่อยของHost]
  • Hostname
    ระบุชื่อโฮสต์ที่แท้จริงเพียงใช้github.comสำหรับ github
  • Usergit
    ผู้ใช้อยู่เสมอgitสำหรับ gitHub,
  • IdentityFile
    ระบุรหัสที่จะใช้เพียงแค่ใส่เส้นทางของกุญแจสาธารณะ
  • LogLevel
    ระบุระดับการบันทึกที่จะทำการดีบั๊กหากมีปัญหาDEBUG3จะให้ข้อมูลโดยละเอียดที่สุด


น่ารัก - ไม่ต้องการssh-add path_to_private_key- อาจเป็นเพราะตัวแทนไม่จำเป็นในกรณีนี้ ไฟล์กำหนดค่าจะกำหนดเส้นทางไปยังคีย์อย่างชัดเจน
Mark Chackerian

2
@ MarkChackerian ฉันคิดว่าคุณไม่จำเป็นต้องใช้ssh-addเพราะคีย์ของคุณไม่ได้รับการป้องกันด้วยรหัสผ่านหรือ (หากคุณใช้ Mac) พวงกุญแจ OSX จะจัดการให้คุณ ssh-addป้องกันไม่ให้คุณต้องป้อนข้อความรหัสผ่านทุกครั้งที่คุณเข้าถึงกุญแจ
Ashhar Hasan

18

ใช้IdentityFileพารามิเตอร์ใน~/.ssh/config:

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance

ขอบคุณ แต่สิ่งนี้ไม่ถูกต้องนัก ฉันพบคำตอบและแบ่งปันด้านล่าง
radesix

ฉันค่อนข้างมั่นใจว่าแนวทางของฉันจะใช้งานได้ในกรณีของคุณ คุณสามารถระบุผู้ใช้ที่แตกต่างกันและไฟล์ประจำตัวที่แตกต่างกัน เพียงแค่ต้องให้พารามิเตอร์ Host แต่ละตัวที่แตกต่างกันใน config stanza
Andy Lester

1
แอนดี้ตามลิงค์ที่ฉันพบด้านล่างฉันจำเป็นต้องวาง. com จากโฮสต์ เมื่อฉันทำมันทำงานได้ดี
radesix

5

ทางเลือกอื่นที่ง่ายกว่าในการแก้ไขไฟล์ ssh (ตามที่แนะนำในคำตอบอื่น ๆ ทั้งหมด) คือการกำหนดค่าที่เก็บแต่ละรายการเพื่อใช้คีย์ ssh อื่น (เช่นไม่ใช่ค่าเริ่มต้น)

ภายในพื้นที่เก็บข้อมูลที่คุณต้องการใช้คีย์อื่นให้รัน:

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'

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

ssh-add ~/.ssh/id_rsa_anotheraccount

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

นอกจากนี้ควรเป็นไปได้ที่จะขยายวิธีการนี้ไปยังที่เก็บข้อมูลหลายแห่งโดยใช้การกำหนดค่าโกลบอล git และการรวมตามเงื่อนไข ( ดูตัวอย่าง )


4

ในกรณีของฉันไม่มีวิธีการแก้ปัญหาข้างต้นแก้ไขปัญหาของฉัน แต่ ssh-agent ทำ โดยพื้นฐานแล้วฉันทำสิ่งต่อไปนี้:

  1. สร้างคู่ของคีย์โดยใช้ ssh-keygen ที่แสดงด้านล่าง มันจะสร้างคู่ที่สำคัญ (ในตัวอย่างนี้.\keyfileและ.\keyfile.pub)

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile

  2. อัปโหลดkeyfile.pubไปยังผู้ให้บริการคอมไพล์

  3. เริ่ม ssh-agent บนเครื่องของคุณ (คุณสามารถตรวจสอบด้วยps -ef | grep ssh-agentเพื่อดูว่ามันกำลังทำงานอยู่แล้ว)
  4. เรียกใช้ssh-add .\keyfileเพื่อเพิ่มข้อมูลรับรอง
  5. ตอนนี้คุณสามารถเรียกใช้ git clone git@provider:username/project.git

4

ฉันใช้เวลามากมายในการทำความเข้าใจทุกขั้นตอน ดังนั้นให้อธิบายทีละขั้นตอน:

  1. ssh-keygen -t rsaสร้างไฟล์ใหม่โดยใช้ตัวตน ให้มันเป็นทางเลือกเช่นproj1.id_rsaและตีอย่างไม่ต้องสงสัยเพราะคุณไม่ต้องการข้อความรหัสผ่าน
  2. เพิ่มหัวข้อใหม่ใน.ssh/config:

    Host proj1.github.com
        HostName github.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/proj1.id_rsa
    

คำนึงถึงส่วนแรกและโปรดทราบว่าproj1.github.comเราจะกลับไปที่ส่วนในภายหลัง

  1. เพิ่มเอกลักษณ์ให้กับตัวแทน ssh ssh-add ~/.ssh/proj1.id_rsa
  2. นั่นคือสิ่งที่ฉัน messed ครั้งแรก - ตอนนี้เมื่อคุณต้องการโคลน proj1 repo ที่คุณทำมันใช้proj1.github.com(ตรงโฮสต์จากไฟล์ config) git clone git@proj1.github.com.

กวดวิชาที่ดี

อย่าสับสนกับโฮสต์


ขอบคุณสำหรับลิงค์ไปยังป้อมปราการ! คุณมีการพิมพ์ผิด: ชื่อคีย์id_rsa_proj1และproj1_id_rsaควรเหมือนกันจริง ๆ คุณสามารถเพิ่มส่วนเกี่ยวกับ.git/configการตั้งค่าจากบทช่วยสอนไปยังคำตอบของคุณ
cezar

คุณยังมีตัวพิมพ์ผิด: proj1.id_rsavs.proj1_id_rsa
cezar

2

ฉันใช้,

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User abc@gmail.com

มันก็ไม่เป็นไร

ใช้การตั้งค่าด้านบนในไฟล์. ssh / config สำหรับคีย์ rsa ที่แตกต่างกันสำหรับชื่อผู้ใช้ที่แตกต่างกัน


2

เป็นส่วนเสริมของคำตอบของ @stefano มันจะดีกว่าถ้าใช้คำสั่งด้วย-fเมื่อสร้างคีย์ SSH ใหม่สำหรับบัญชีอื่น

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"

เนื่องจากid_rsa_workไฟล์ไม่มีอยู่ในพา ธ~/.ssh/และฉันสร้างไฟล์นี้ด้วยตนเองและมันไม่ทำงาน :(


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