จะบอกคอมไพล์คีย์ส่วนตัวให้ใช้อย่างไร


646

sshมี-iตัวเลือกให้บอกไฟล์กุญแจส่วนตัวที่จะใช้เมื่อตรวจสอบความถูกต้อง:

-i identity_file

    เลือกไฟล์ที่จะอ่านข้อมูลประจำตัว (คีย์ส่วนตัว) สำหรับการตรวจสอบความถูกต้องของ RSA หรือ DSA ค่าเริ่มต้น~/.ssh/identityสำหรับโพรโทคอลรุ่น 1 และ~/.ssh/id_rsaและ~/.ssh/id_dsaสำหรับโพรโทคอลรุ่น 2 อาจมีระบุแฟ้มข้อมูลประจำตัวสำหรับแต่ละโฮสต์ในแฟ้มการกำหนดค่า เป็นไปได้ที่จะมีหลาย-iตัวเลือก (และตัวระบุหลายตัวที่ระบุในไฟล์กำหนดค่า)

มีวิธีที่คล้ายกันในการบอกgitไฟล์ไพรเวตคีย์ที่จะใช้ในระบบที่มีไพรเวตคีย์หลายรายการใน~/.sshไดเร็กทอรีหรือไม่?


3

คำตอบ:


671

ใน~/.ssh/configเพิ่ม:

host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github
 User git

git clone git@github.com:username/repo.gitตอนนี้คุณสามารถทำ

หมายเหตุ: ตรวจสอบว่าสิทธิ์ใน IdentityFile คือ 400 SSH จะปฏิเสธคีย์ SSH ที่ไม่ชัดเจนอย่างชัดเจนในลักษณะที่ไม่ชัดเจน มันจะดูเหมือนการปฏิเสธข้อมูลรับรอง การแก้ปัญหาในกรณีนี้คือ:

chmod 400 ~/.ssh/id_rsa_github

117
ถ้าคุณต้องการเชื่อมต่อกับโฮสต์เดียวกันด้วยคีย์ที่ต่างกัน
Valentin Klinghammer

6
@Quelltextfabrik - คุณสามารถเพิ่มอีกส่วนที่มีโฮสต์อื่น: nerderati.com/2011/03/…
Ben Challenor

1
@Cliff Nop ใน manpage ของฉัน: " HostName: ระบุชื่อโฮสต์จริงเพื่อเข้าสู่ระบบซึ่งสามารถใช้เพื่อระบุชื่อเล่นหรือตัวย่อสำหรับโฮสต์" เวอร์ชัน ssh ของฉันคือ openssh-6.7p1
Grissiom

11
หากไฟล์กำหนดค่าเป็นไฟล์ใหม่อย่าลืมที่จะทำchmod 600 ~/.ssh/config
elysch

2
@ValentinKlinghammer คำตอบจาก @Flimm มีทางออกสำหรับคำถามนี้ มันคือการใช้core.sshCommandการกำหนดค่าคอมไพล์ superuser.com/a/912281/162466
VasyaNovikov

345

ตัวแปรสภาพแวดล้อมGIT_SSH_COMMAND:

จาก Git เวอร์ชัน 2.3.0 คุณสามารถใช้ตัวแปรสภาพแวดล้อมGIT_SSH_COMMANDดังนี้:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

โปรดทราบว่า-iบางครั้งไฟล์ทับของคุณสามารถถูกแทนที่ได้ในกรณีนี้คุณควรให้ไฟล์ปรับแต่ง SSH ที่ว่างเปล่าแบบนี้:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

การกำหนดค่าcore.sshCommand:

จาก Git เวอร์ชั่น 2.10.0 คุณสามารถกำหนดค่านี้สำหรับแต่ละ repo หรือทั่วโลกดังนั้นคุณไม่จำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อมอีกต่อไป!

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push

1
ฉันต้องส่งออกตัวแปรเชลล์ไปยังตัวแปรสภาพแวดล้อมเพื่อทำงานนี้เช่นexport GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example"นั้นgit clone example
Abdull

7
@Abdull ใน Bash ทำการกำหนดบนบรรทัดเดียวกันกับคำสั่งส่งออกตัวแปรสภาพแวดล้อมสำหรับเพียงคำสั่งนั้น example=hello /usr/bin/env | grep exampleลองใช้:
Flimm

3
สิ่งต่าง ๆ ที่ดียิ่งขึ้น: จาก Git 2.10 คุณสามารถจัดเก็บคำสั่งไว้ในการกำหนดค่า Git ของคุณ: stackoverflow.com/a/38474220/520162
eckes

2
@Noitidart /dev/nullเป็นเพียงชื่อไฟล์ที่ถูกต้องในระบบปฏิบัติการ UNIX มันไม่ทำงานบน Windows
Flimm

2
สำหรับผมGIT_SSH_COMMANDไม่ได้ทำงานจนกว่าฉันจะใช้เช่นคำสั่งนี้:IdentitiesOnly GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push
Tyler Collier

111

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

ตัวเลือกที่ 1: ssh-agent

คุณสามารถใช้ssh-agentเพื่ออนุญาตคีย์ส่วนตัวของคุณชั่วคราว

ตัวอย่างเช่น:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

ตัวเลือก 2: GIT_SSH_COMMAND

ผ่านอาร์กิวเมนต์ ssh โดยใช้GIT_SSH_COMMANDตัวแปรสภาพแวดล้อม (Git 2.3.0+)

ตัวอย่างเช่น:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

คุณสามารถพิมพ์นี้ทั้งหมดในหนึ่งเส้น - ไม่สนใจและปล่อยออกมา$\

ตัวเลือก 3: GIT_SSH

ผ่านอาร์กิวเมนต์ ssh โดยใช้GIT_SSHตัวแปรสภาพแวดล้อมเพื่อระบุsshไบนารีสำรอง

ตัวอย่างเช่น:

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

หมายเหตุ: บรรทัดด้านบนคือบรรทัดคำสั่งเชลล์ (เทอร์มินัล) ซึ่งคุณควรวางลงในเทอร์มินัลของคุณ พวกเขาจะสร้างไฟล์ที่ชื่อว่าsshทำให้มันสามารถเรียกใช้งานได้และ (โดยอ้อม) เรียกใช้งานมัน

หมายเหตุ: GIT_SSHมีให้บริการตั้งแต่ v0.99.4 (2005)

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

ใช้~/.ssh/configไฟล์ตามคำแนะนำในคำตอบอื่น ๆ เพื่อระบุตำแหน่งของคีย์ส่วนตัวของคุณเช่น

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa

1
//, จะเป็นอย่างไรถ้าข้อมูลประจำตัวของคุณใน ssh-agent ถูกส่งต่อ, เช่นเดียวกับในคำถามนี้? superuser.com/questions/971732/…
Nathan Basanese

1
ฉันอนุญาตให้ฉันฟอร์แมตโพสต์นี้: IMO นี่เป็นคำตอบที่ครอบคลุมที่สุด ในการออกแบบดั้งเดิมการสแกนอย่างรวดเร็วแนะนำโพสต์ที่อธิบายถึงวิธีแก้ไขปัญหาที่ซับซ้อนเพียงปัญหาเดียวดังนั้นฉันจึงพลาดมันไป
Alberto

3
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'ทำงานสำหรับฉันเมื่อไม่มีอะไรจะ ความรุ่งโรจน์
Daniel Dewhurst

1
ผมใช้~/.ssh/configวิธี env vars ไม่ได้ทำงานสำหรับฉัน ...
เกร็ก Dubicki

1
GIT_SSHมีให้ตั้งแต่v0.99.4 (สิงหาคม 2548)ดังนั้นโดยทั่วไปตั้งแต่ Git มีอยู่ (เมษายน 2548)
Dominik

32

เขียนสคริปต์ที่เรียกว่ามีข้อโต้แย้งที่คุณต้องการและใส่ชื่อไฟล์ของสคริปต์ในssh หรือเพียงแค่ใส่ในการกำหนดค่าของคุณ$GIT_SSH~/.ssh/config


2
คำอธิบายของวิธีการทำเช่นนี้อีก
Sithsu

1
~/.ssh/configคือวิธีที่จะไป
hek2mgl

ฉันทำงานบนเครื่อง (A) ที่ฉันใช้เพื่อผลักดันไปยังเซิร์ฟเวอร์ (B) ที่ยอมรับเฉพาะการรับรองความถูกต้องของคีย์ ssh เท่านั้น ในขณะที่การตั้งค่า ~ / .ssh / config ของฉันใน (A) ทำงานได้อย่างสมบูรณ์แบบเมื่อฉันทำงานโดยตรงบนเครื่องนั้นมันไม่ได้เมื่อฉันเข้าสู่ระบบจากที่อื่น (C) การใช้$GIT_SSHและสคริปต์แก้ไขปัญหานี้ ขอบคุณ!
bsumirak

18

หากคุณไม่ต้องการระบุตัวแปรสภาพแวดล้อมทุกครั้งที่คุณเรียกใช้ git ไม่ต้องการสคริปต์ wrapper ตัวอื่นอย่า / ไม่สามารถเรียกใช้ ssh-agent (1) หรือไม่ต้องการดาวน์โหลดแพ็คเกจอื่นเพียงแค่ใช้ git -remote-ext (1) การขนส่งภายนอก:

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin  ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

ฉันพิจารณาโซลูชันนี้ดีกว่าเพราะ:

  • มันเป็นที่เก็บ / เฉพาะระยะไกล
  • หลีกเลี่ยงการขยายสคริปต์ wrapper
  • ไม่ต้องการเอเจนต์ SSH - มีประโยชน์ถ้าคุณต้องการโคลน / ดัน / ดึงแบบไม่ต้องใส่เครื่อง (เช่นใน cron)
  • ไม่ต้องใช้เครื่องมือภายนอก

2
คำตอบนี้เป็นสิ่งที่ฉันต้องการเพื่อบังคับให้gitทรัพยากรของเชฟใช้คีย์การปรับใช้เฉพาะที่เก็บเพื่อโคลน / ดึงข้อมูลจากที่เก็บส่วนตัว Github ข้อได้เปรียบเพิ่มเติมของวิธีการนี้กับสภาพแวดล้อม / สคริปต์ที่ใช้คือเนื่องจากคีย์ - พา ธ ถูกเข้ารหัสในการกำหนดค่าของ repo ของการทำงานมันจะใช้คีย์เดียวกันทั้งในการโคลนเริ่มต้นและการดึง / กดถัดมา
Adam Franco

2
ว้าว! นี่ยอดเยี่ยมมากไม่รู้เรื่องนี้เลย ขอบคุณสำหรับคำตอบมีประโยชน์มากเช่นกันในสภาพแวดล้อมหุ่นเชิดเพื่อป้องกันไม่ให้ยุ่งยากในการจัดการ.ssh/configเป็นต้น +1!
gf_

1
โซลูชันนี้ไม่ทำงานร่วมกับแฟล็ก --recursive submodules จะไม่ถูกเรียกใช้โดยใช้คีย์ที่ระบุและจะล้มเหลวหากต้องการ auth
Daniele Testa

1
แต่ละ submodule เป็นพื้นที่เก็บข้อมูลที่แตกต่างกันอย่างสิ้นเชิงกับชุดรีโมทของตัวเอง พวกเขากำลังติดกาวด้วยกันโดย Git เพื่อความสะดวกของคุณ แต่ในทางใดทางหนึ่งรีโมตสำหรับซับโฟลถูกผูกติดกับที่อยู่ในพื้นที่เก็บข้อมูลหลัก ฉันกลัวว่าคุณจะต้องตั้งค่าระยะไกลโดยใช้การextขนส่งในแต่ละ submodule เพื่อให้การเรียกซ้ำในแม่ทำงาน
flaviovs

2
หากคุณพบข้อผิดพลาดดังต่อไปนี้คุณจะต้องอนุญาตพิเศษโปรโตคอลต่อผ่านทางfatal: transport 'ext' not allowed export GIT_ALLOW_PROTOCOL=extโดยพื้นฐานแล้วตัวช่วยเหลือระยะไกล git-remote-ext (ซึ่งรองรับ URL "ext :: ssh example.com% S foo / repo" URL) อนุญาตการดำเนินการคำสั่งโดยพลการ ปกติแล้วสิ่งนี้ไม่เป็นที่กังวลเพราะผู้ใช้จะเห็นและเชื่อถือ URL ที่พวกเขาส่งไปยังคอมไพล์เสมอ อย่างไรก็ตาม git submodules ผ่านไฟล์. gitmodules อนุญาตให้ผู้โจมตีร้องขอให้ลูกค้าดึง URL git ออกมาเอง hackerone.com/reports/104465
Gomino

18

ใช้การกำหนดค่าโฮสต์ที่กำหนดเอง~/.ssh/configเช่นนี้:

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

จากนั้นใช้ชื่อโฮสต์ที่กำหนดเองของคุณเช่นนี้:

git remote add thuc git@gitlab-as-thuc:your-repo.git  

2
นี่คือคำตอบที่ฉันกำลังมองหาเนื่องจากฉันมีบัญชี GitHub แยกต่างหากสำหรับบ้านและที่ทำงาน ฉันต้องตั้งค่าHost work.github.com HostName github.com IdentityFile ~/.ssh/workแล้วแทนที่ "github.com" โดย "work.github.com" ทุกครั้งที่ฉันโคลนที่เก็บงาน มันยังคงเชื่อมต่อกับ "github.com" แต่ใช้คู่คีย์ที่ไม่ใช่ค่าเริ่มต้น
Mikkel

1
URL สำหรับรายละเอียด (" itblog.study.land / ... " ) ไม่ทำงานอีกต่อไป :(
Carl Smotricz

@CarlSmotricz เป็นต้นฉบับถูกย้ายที่นี่: medium.com/@thucnc/…
thucnguyen

4
ในที่สุด !!! คำตอบนี้แสดงให้เห็นว่าคุณสามารถใช้ประโยชน์จากสิ่งที่คุณใส่ใน~/.ssh/configไฟล์ได้อย่างไร ทุกคำตอบอื่น ๆ คิดถึงวิธีที่คุณสามารถตั้งค่าโฮสต์เมื่อคุณเพิ่มต้นกำเนิดซึ่งอนุญาตให้ git ใช้ไฟล์คีย์ที่ถูกต้องโดยอัตโนมัติ ขอขอบคุณ!!
BrianVPS

1
ดีนั่นคือสิ่งที่ผมกำลังมอง :)
ลูคัสโก Avila

15

หลังจากต่อสู้กับ$GIT_SSHฉันอยากจะแบ่งปันสิ่งที่ทำงานให้ฉัน

จากตัวอย่างของฉันฉันจะถือว่าคุณมีรหัสส่วนตัวของคุณอยู่ที่/home/user/.ssh/jenkins

ข้อผิดพลาดที่ควรหลีกเลี่ยง: ค่า GIT_SSH รวมถึงตัวเลือกต่างๆ

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

หรือสิ่งที่คล้ายประสงค์ล้มเหลวเป็นคอมไพล์จะพยายามที่จะดำเนินการค่าที่เป็นไฟล์ ด้วยเหตุนี้คุณต้องสร้างสคริปต์

ตัวอย่างการทำงานของสคริปต์ $ GIT_SSH /home/user/gssh.sh

สคริปต์จะถูกเรียกใช้ดังนี้:

$ $GIT_SSH [username@]host [-p <port>] <command>

ตัวอย่างการทำงานของสคริปต์อาจมีลักษณะดังนี้:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*

สังเกต$*ที่ส่วนท้ายมันเป็นส่วนสำคัญของมัน

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

#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*

สมมติว่าสคริปต์อยู่ใน/home/user/gssh.shนั้นคุณจะต้อง:

$ export GIT_SSH=/home/user/gssh.sh

และทั้งหมดจะทำงาน


ขอบคุณ เพียงแค่ทราบว่า: ใช้ "$ @" แทน $ * สำหรับอาร์กิวเมนต์แบบพาส - ทรูเนื่องจากรูปแบบก่อนหน้าจะทำงานอย่างถูกต้องเมื่ออาร์กิวเมนต์มีช่องว่าง
Piotr Findeisen

@PiotrFindeisen ขอบคุณสำหรับข้อความของคุณ อย่างไรก็ตามฉันไม่เข้าใจมันอย่างสมบูรณ์ - ใน zsh มันช่วยให้ฉันเก็บสายอักขระด้วยช่องว่างในชิ้นเดียว แต่ในการทุบตีไม่ได้ คุณช่วยบอกฉันเพิ่มเติมหรือชี้ไปที่คำอธิบายได้ไหม? ฉันไม่ต้องการที่จะเพิ่มการปรับเปลี่ยนบางอย่างสุ่มสี่สุ่มห้า
Jan Vlcinsky

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

@Cerin หากคุณหมายถึงการลบ "ข้อผิดพลาดเพื่อหลีกเลี่ยง" ฉันจะเก็บมันไว้ที่นั่น มันแบ่งปันกับดักที่พบบ่อยเพื่อหลีกเลี่ยงและมันสั้นมาก ฉันแน่ใจว่ามีบางคนพยายามเพิ่มประสิทธิภาพการแก้ปัญหาด้วยการมอบทุกสิ่งให้เป็นตัวแปร (สิ่งนี้เกิดขึ้นกับฉัน) ดังนั้นฉันจึงพยายามลดเส้นทางสู่ความสำเร็จ
Jan Vlcinsky

5

คุณสามารถใช้ ssh-ident แทนการสร้าง wrapper ของคุณเอง

คุณสามารถอ่านเพิ่มเติมได้ที่: https://github.com/ccontavalli/ssh-ident

มันโหลด ssh คีย์ตามความต้องการเมื่อจำเป็นครั้งแรกครั้งเดียวแม้จะมีเซสชันการเข้าสู่ระบบหลายครั้ง xterms หรือบ้านที่ใช้ร่วมกัน NFS

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


5

ฉันมีลูกค้าที่ต้องการบัญชี GitHub แยกต่างหาก ดังนั้นฉันต้องใช้คีย์แยกต่างหากสำหรับโปรเจ็กต์นี้

โซลูชันของฉันคือการเพิ่มสิ่งนี้ใน. zshrc / .bashrc ของฉัน:

alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"

เมื่อใดก็ตามที่ฉันต้องการใช้ git สำหรับโครงการนั้นฉันแทนที่ "infogit" ด้วย git:

infogit commit -am "Some message" && infogit push

สำหรับฉันมันง่ายต่อการจดจำ


4

ดังนั้นผมจึงตั้งค่าตัวแปร env GIT_SSH $HOME/bin/git-sshไป

เพื่อรองรับการกำหนดค่า repo ของฉันบอกให้ใช้ข้อมูลประจำตัวของ ssh ~/bin/git-sshไฟล์ของฉันคือ:

#!/bin/sh
ssh -i $(git config --get ssh.identity) -F /dev/null -p 22 $*

จากนั้นฉันก็มีการตั้งค่า git global:

$ git config --global ssh.identity ~/.ssh/default_id_rsa

และภายในพื้นที่เก็บข้อมูล git ใด ๆ ฉันสามารถตั้งค่าssh.identitygit config ในพื้นที่ได้:

$ git config --local ssh.identity ~/.ssh/any_other_id_rsa

Voila!

หากคุณสามารถมีที่อยู่อีเมลที่แตกต่างกันสำหรับข้อมูลประจำตัวแต่ละอย่างมันจะง่ายขึ้นเพราะคุณสามารถตั้งชื่อคีย์ของคุณหลังจากที่อยู่อีเมลของคุณแล้วให้ผู้ใช้ config git ตั้งค่าอีเมลให้เลือกคีย์ใน~/bin/git-sshลักษณะนี้:

#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*

2

วิธีแก้ปัญหาของฉันคือ:

สร้างสคริปต์:

#!/bin/bash
KEY=dafault_key_to_be_used
PORT=10022 #default port...
for i in $@;do
   case $i in
    --port=*)
        PORT="${i:7}";;
    --key=*)KEY="${i:6}";;
   esac
done
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/${KEY} -p ${PORT}"
echo Command: $GIT_SSH_COMMAND

จากนั้นเมื่อคุณต้องเปลี่ยน var run:

. ./thescript.sh [--port=] [--key=]

อย่าลืมจุดพิเศษ !! สิ่งนี้ทำให้สคริปต์กำหนดสภาพแวดล้อมที่ไม่เหมาะสม !! - คีย์และ - พอร์ตเป็นตัวเลือก


2

โดยทั่วไปคุณต้องการใช้~/.ssh/configสำหรับสิ่งนี้ เพียงจับคู่ที่อยู่เซิร์ฟเวอร์กับคีย์ที่คุณต้องการใช้ดังต่อไปนี้:

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host *หมายถึงเซิร์ฟเวอร์ใด ๆ ดังนั้นฉันใช้มันเพื่อตั้ง~/.ssh/id_rsaเป็นคีย์เริ่มต้นที่จะใช้


2

ฉันสร้าง @shellholic และเธรด SO นี้ด้วยไม้สักเล็กน้อย ฉันใช้ GitHub เป็นตัวอย่างและสมมติว่าคุณมีไพรเวตคีย์ใน~/.ssh/github(มิฉะนั้นให้ดูเธรด SO นี้ ) และคุณเพิ่มพับลิกคีย์ไปยังโปรไฟล์ GitHub ของคุณ (หรือดูความช่วยเหลือของ GitHub )

หากจำเป็นให้สร้างไฟล์กำหนดค่า SSH ใหม่ที่~/.ssh/configและเปลี่ยนสิทธิ์เป็น 400

touch ~/.ssh/config
chmod 600 ~/.ssh/config

เพิ่มลงใน~/.ssh/configไฟล์:

Host github.com
    IdentityFile ~/.ssh/github
    IdentitiesOnly yes

หากคุณมีการตั้งค่าระยะไกลแล้วคุณอาจต้องการลบมิฉะนั้นคุณอาจได้รับแจ้งชื่อผู้ใช้และรหัสผ่าน:

git remote rm origin

จากนั้นเพิ่มรีโมตในที่เก็บ git และสังเกตเห็นโคลอนก่อนชื่อผู้ใช้:

git remote add origin git@github.com:user_name/repo_name.git

จากนั้นคำสั่ง git ก็ทำงานได้ตามปกติเช่น:

git push origin master
git pull origin 

@HeyWatchThis ในเธรด SO นี้จึงแนะนำให้เพิ่มIdentitiesOnly yesเพื่อป้องกันพฤติกรรมเริ่มต้นของ SSH ในการส่งไฟล์ข้อมูลประจำตัวที่ตรงกับชื่อไฟล์เริ่มต้นสำหรับแต่ละโปรโตคอล ดูกระทู้ที่สำหรับข้อมูลเพิ่มเติมและการอ้างอิง


นี่เป็นความผิดพลาดของฉัน: "หากคุณมีการตั้งค่าระยะไกลแล้ว ... " ขอบคุณมาก!!!
อัลลัน Andrade

ความผิดพลาดทั่วไป --- นี่คือคำตอบ
Goddard

1

เพียงใช้ssh-agentและssh-addคำสั่ง

# create an agent
ssh-agent

# add your default key
ssh-add ~/.ssh/id_rsa

# add your second key
ssh-add ~/.ssh/<your key name>

หลังจากดำเนินการคำสั่งข้างต้นคุณสามารถใช้ทั้งสองปุ่มในเวลาเดียวกัน เพียงพิมพ์

git clone git@github.com:<yourname>/<your-repo>.git

เพื่อโคลนที่เก็บของคุณ

คุณต้องดำเนินการคำสั่งข้างต้นหลังจากที่คุณรีบูตเครื่อง


โปรดอธิบายขั้นตอนรวมถึงฉันจะสร้างตัวแทนได้อย่างไร
Srikrushna

0

ฉันใช้ git เวอร์ชั่น 2.16 และฉันไม่ต้องการสคริปต์ชิ้นเดียวแม้แต่คำสั่งปรับแต่งหรือแก้ไข

  • เพิ่งคัดลอกกุญแจส่วนตัวของฉันไปที่. ssh / id_rsa
  • กำหนดสิทธิ์เป็น 600

และคอมไพล์อ่านคีย์โดยอัตโนมัติ ฉันไม่ได้ถามอะไรเลยและมันก็ไม่ผิดพลาด ทำงานได้ดี


คุณสังเกตเห็นว่าคำถามนั้นเกี่ยวกับ“ ระบบที่มีคีย์ส่วนตัวหลายรายการใน~/.sshไดเรกทอรี” หรือไม่?
สกอตต์

0

ขณะที่คำถามที่ไม่ได้ขอผมรวมทั้งคำตอบนี้สำหรับคนอื่นมองในการแก้ปัญหาเดียวกันเพียงเฉพาะสำหรับgitlab

โซลูชัน gitlab

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

~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]

ติดตั้ง

เรียกคืนตำแหน่งของรหัส ของคุณ/myfolder/.ssh/my_gitlab_id_rsaในกรณีของฉัน

เพิ่มรายการใน~/.ssh/config:

Host gitlab-delegate
    HostName gitlab.mydomain.com
    User git
    IdentityFile /myfolder/.ssh/my_gitlab_id_rsa
    IdentitiesOnly yes

เพิ่มใน~/.gitconfig:

mypush = "!f() { \
           path=$(git config --get remote.origin.url | cut -d':' -f2); \
           branch=$(git rev-parse --abbrev-ref HEAD); \
           git remote add gitlab_as_me git@gitlab-delegate:$path && \
           git push gitlab_as_me $branch && \
           git pull origin $branch; \
           git remote remove gitlab_as_me; \
         }; f"

ในฐานะโบนัสฉันทำการคอมมิทบนโฮสต์เดียวกันนี้กับผู้ใช้ที่มีนี้:

mycommit = "!f() { \
             git -c "user.name=myname" -c "user.email=myname@mysite.com" commit \"$@\"; \
           }; f"

คำอธิบาย

จากทั้งหมดที่กล่าวมาข้างต้นจะถือว่ารีโมทนั้นoriginเกี่ยวข้องและสาขาที่เกี่ยวข้องนั้นได้ทำการชำระเงินแล้ว สำหรับการอ้างอิงฉันวิ่งเข้าไปในหลายรายการที่จำเป็นต้องได้รับการแก้ไข:

  • โซลูชันต้องการสร้างรีโมตใหม่gitlab_as_meและฉันไม่ต้องการเห็นรีโมตพิเศษที่แขวนอยู่รอบ ๆ ในล็อกทรีของฉันดังนั้นฉันจึงลบออกเมื่อเสร็จสิ้น
  • ในการสร้างรีโมตนั้นจำเป็นต้องสร้าง url ของรีโมตในการบิน - ในกรณีของ gitlab สิ่งนี้สามารถทำได้โดยการ bash ที่เรียบง่าย
  • เมื่อดำเนินการผลักดันให้gitlab_as_meคุณจะต้องมีความเฉพาะเจาะจงเกี่ยวกับสาขาที่คุณกำลังผลักดัน
  • หลังจากดำเนินการกดoriginตัวชี้ท้องถิ่นของคุณจะต้อง "อัพเดท" เพื่อให้ตรงกับgitlab_as_me(สิ่งgit pull origin $branchนี้)

0

เมื่อคุณมีหลายบัญชีคอมไพล์และคุณต้องการคีย์ ssh ที่แตกต่างกัน

คุณต้องทำตามขั้นตอนเดียวกันสำหรับการสร้างคีย์ ssh แต่ต้องแน่ใจว่าคุณ

ssh-keygen -t ed25519 -C "your-email-id@gmail.com" 

ป้อนเส้นทางที่คุณต้องการบันทึก (เช่น: my-pc / Desktop / .ssh / ed25519)

เพิ่มพับลิกคีย์ให้กับ gitlab ของคุณ ( วิธีเพิ่มคีย์ ssh ไปยัง gitlab )

คุณต้องระบุข้อมูล ssh ใหม่โดยใช้ comand ด้านล่าง

ssh-add ~/my-pc/Desktop/.ssh/ed25519

(1) คุณอ้างถึงบางคนหรือบางสิ่งบางอย่าง? ถ้าเป็นเช่นนั้นโปรดระบุแหล่งที่มา ถ้าไม่ใช่โปรดอย่าใช้การจัดรูปแบบคำพูด (2)“ ed25519” คืออะไร? …………………………………โปรดอย่าตอบในความคิดเห็น แก้ไข  คำตอบของคุณเพื่อให้ชัดเจนและสมบูรณ์ยิ่งขึ้น
สกอตต์

0
    # start :: how-to use different ssh identity files

    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "first.last@corp.com"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "me@gmail.com"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@git.in.corp.com:corp/project.git

    export git_msg="my commit msg with my corporate identity, explicitly provide author"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@corp.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@github.com:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity, again author "
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@gmail.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push ; 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

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