จะระบุคีย์ SSH ส่วนตัวที่จะใช้เมื่อเรียกใช้คำสั่งเชลล์บน Git ได้อย่างไร


1108

อาจเป็นสถานการณ์ที่ผิดปกติ แต่ฉันต้องการระบุคีย์ SSH ส่วนตัวที่จะใช้เมื่อเรียกใช้คำสั่ง shell (git) จากคอมพิวเตอร์ในระบบ

โดยทั่วไปเช่นนี้

git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

หรือดียิ่งขึ้น (ใน Ruby):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone git@github.com:TheUser/TheProject.git")
end

ฉันได้เห็นตัวอย่างของการเชื่อมต่อกับเซิร์ฟเวอร์ระยะไกลด้วย Net :: SSH ที่ใช้ไพรเวตคีย์ที่ระบุ แต่นี่เป็นคำสั่งโลคอล เป็นไปได้ไหม?



28
ฉันสงสัยว่าทำไมเรื่องนี้จึงแปลกประหลาดมากที่ Git ไม่มี-iตัวเลือกเช่นsshนั้น
Nick T

29
ด้วยคอมไพล์ 2.10 (Q3 2016), git config core.sshCommand 'ssh -i private_key_file'คุณยังมีการตั้งค่าใหม่: ดูคำตอบของฉันด้านล่าง
VonC

3
ในความเห็นของฉันคำตอบ HeyWatchThis ควรเป็นคำตอบที่ยอมรับเพราะอนุญาตให้คำสั่ง git ทั้งหมดทำงานตามปกติหลังจากตั้งค่าแทนที่จะต้องทำ subshell สำหรับแต่ละคำสั่ง git ตามคำตอบที่ยอมรับในปัจจุบัน
gloriphobia

คำตอบ:


800

สิ่งนี้ควรใช้งานได้ (แนะนำโดย orip):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

หากคุณต้องการ subshells คุณสามารถลองต่อไปนี้ (แม้ว่าจะบอบบางกว่า):

ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)

Git จะเรียกใช้ SSH ซึ่งจะค้นหาตัวแทนโดยตัวแปรสภาพแวดล้อม ในทางกลับกันจะมีการโหลดกุญแจ

หรือมิฉะนั้นการตั้งค่าHOMEอาจทำเคล็ดลับหากคุณยินดีที่จะตั้งค่าไดเรกทอรีที่มีเฉพาะ.sshไดเรกทอรีHOMEดังนี้ สิ่งนี้อาจมี identity.pub หรือการตั้งค่าไฟล์ IdentityFile


5
แต่สิ่งนี้จะเพิ่มคีย์อย่างถาวรในฐานะ SSH-key ที่ยอมรับใช่ไหม ฉันต้องการหลีกเลี่ยงเพื่อให้ theuser2 ไม่สามารถยุ่งกับโครงการของผู้ใช้ มันเป็นเว็บแอปพลิเคชันดังนั้นจึงไม่เหมาะที่จะใช้ผู้ใช้ระบบปฏิบัติการที่แตกต่างกันซึ่งน่าจะเป็นตัวเลือกที่ดีที่สุด
Christoffer

28
ไม่เมื่อ git เสร็จสิ้น ssh-agent จะยกเลิกและกุญแจจะถูกลืม
Martin v. Löwis

6
คำสั่งนี้ไม่ทำงานบน windows git bash มันบอกว่าข้อผิดพลาดทางไวยากรณ์ใกล้โทเค็นที่ไม่คาดคิด 'ssh-add'
Mohit

116
บรรทัดคำสั่งคงที่ (สำหรับ windows หรือ linux) จะเป็นดังนี้:ssh-agent bash -c 'ssh-add sshkey; git clone url'
orip

4
ssh-agent $(..)ไวยากรณ์ไม่ทำงานสำหรับฉันและฉันไม่แน่ใจว่าวิธีการนี้จะคิดว่าจะทำงาน: (BA) ดวลจุดโทษควรรันคำสั่งภายใน$(..)ครั้งแรกจากนั้นก็วิ่งตัวแทน ssh กับการส่งออกเป็นพารามิเตอร์
Ziemke 'ปลา' ของโยฮันเนส

1199

ไม่มีวิธีแก้ปัญหาเหล่านี้สำหรับฉัน

ฉันทำอย่างละเอียดใน @Martin v. Löwisพูดถึงการตั้งค่าconfigไฟล์สำหรับ SSH

SSH จะค้นหา~/.ssh/configไฟล์ของผู้ใช้ ฉันมีการตั้งค่าของฉันเป็น:

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below

และฉันเพิ่มที่เก็บ git ระยะไกล:

git remote add origin git@gitserv:myrepo.git

จากนั้นคำสั่ง git ก็ทำงานได้ตามปกติสำหรับฉัน

git push -v origin master

หมายเหตุ

  • IdentitiesOnly yesจะต้องป้องกันไม่ให้เกิดพฤติกรรม SSH เริ่มต้นของการส่งไฟล์ข้อมูลประจำตัวที่ตรงกับชื่อไฟล์เริ่มต้นสำหรับแต่ละโปรโตคอล หากคุณมีชื่อไฟล์~/.ssh/id_rsaที่จะลองก่อนที่จะ~/.ssh/id_rsa.githubไม่มีตัวเลือกนี้

อ้างอิง


17
ฉันพบว่าเมื่อคุณระบุหลายคีย์โดยใช้. ssh / config คุณต้องใช้ชื่อโฮสต์เพื่อนในบรรทัด "โฮสต์" เป็นส่วนหนึ่งของคำสั่ง "git remote add" หากบรรทัดคือ "Host stg" คุณต้องใช้ git remote เพิ่ม <someName> user @ stg: /path_to_git_repo.git "หากคุณใช้ชื่อเซิร์ฟเวอร์ที่ถูกต้องเช่น user@myserver.com: /path_to_git_repo.git ไฟล์ config ไม่ถูกเลือกโดย git ดังนั้นจึงไม่สามารถเลือกไฟล์กุญแจส่วนตัวได้อย่างถูกต้องฉันพยายามทำสิ่งนี้โดยการกดเนื้อหาเดียวกันกับ github และ heroku และทำงานเฉพาะเมื่อคุณให้ชื่อที่เป็นมิตรใน "git remote add"
Gopinath MR

2
ฉันไม่แน่ใจเกี่ยวกับ Host สำหรับ GitHub ผมพบลิงค์นี้: gist.github.com/jexchan/2351996
Karsten

1
ลองดูที่นี่ถ้าคุณต้องการมีไฟล์คีย์น้อยสำหรับที่เก็บ git น้อย
e271p314

1
คุณสามารถใช้Host remote.server.comและใช้ URL เดิมต่อไป
MauganRa

5
สิ่งนี้ใช้ได้กับฉันหลังจากการเปลี่ยนแปลงสองครั้ง หากไฟล์ config เป็นไฟล์ใหม่อย่าลืมที่จะทำchmod 600 ~/.ssh/config(ดูที่นี่ ) และถ้าคุณกำลังใช้ GitHub แทนที่Host gitservด้วยHost github.comงดและเพิ่มระยะไกลด้วยHostname remote.server.com git remote add origin git@github.com:user_name/repo_name.git
miguelmorin

479

เริ่มต้นจาก Git 2.3.0 เรายังมีคำสั่งง่าย ๆ (ไม่ต้องใช้ไฟล์ปรับแต่ง):

GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git

3
ฉันได้รับcannot run ssh -i /home/vagrant/.ssh/git: No such file or directoryแต่มันมีอยู่444 Nov 16 18:12 /home/vagrant/.ssh/gitจากls -l /home/vagrant/.ssh/git
เท็ด

3
@ted: chmod 400 /home/vagrant/.ssh/git
Yash

8
ทางออกที่ดีและง่าย ฉันขอแนะนำให้สร้างนามแฝงหากคุณต้องการทำสิ่งนี้มาก
Lasse Meyer

5
chmod 400 <path-to-private-key-file>อย่าลืมให้ มิฉะนั้นคำสั่ง git อาจล้มเหลวโดยไม่มีข้อความแสดงข้อผิดพลาดพิเศษ ...
Eonil

5
มันจะดีถ้าคำตอบนี้รวมอยู่ด้วย-o IdentitiesOnly=yesเพื่อให้แน่ใจว่าคีย์ที่ระบุด้วยการ-iใช้ (ตรงข้ามกับคีย์จากเอเจนต์ SSH)
robinst

423

ข้อเสนอแนะของคนอื่นเกี่ยวกับ~/.ssh/configมีความซับซ้อนเป็นพิเศษ สามารถทำได้ง่ายเพียง:

Host github.com
  IdentityFile ~/.ssh/github_rsa

30
คุณต้องการIdentitiesOnlyตัวเลือกด้วย
Flimm

4
@EnzeChi คุณสามารถมีบัญชีหลาย GitHub git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.gitโดยการจัดการรีโมทไปนี้: จากนั้นคุณตั้งค่าคอนฟิกดูเหมือนHost personal HostName github.com ... Host corporate HostName github.com
emory

@EnzeChi ฉันทำบางสิ่งที่คล้ายกันเพื่อที่ฉันจะใช้ 2 คีย์ ssh ที่แตกต่างกัน - อันหนึ่งสำหรับการดึงข้อมูลและอีกอันสำหรับการผลักดัน การดึงข้อมูลไม่มีข้อความรหัสผ่าน ดันไม่
emory

144

เนื้อหาของ my_git_ssh_wrapper:

#!/bin/bash

ssh -i /path/to/ssh/secret/key $1 $2

จากนั้นคุณสามารถใช้รหัสได้โดยทำ:

GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git

4
ทางออกที่ดีมากถ้าคุณมีมากกว่าหนึ่งบัญชีในโดเมนเดียวกันซึ่งโซลูชั่นอื่น ๆ ที่ไม่ได้จัดการดี
Beka

1
ทางออกที่ดี คุณสามารถทำให้สิ่งนี้ง่ายขึ้นด้วย> GIT_SSH = my_git_ssh_wrapper; git clone git@github.com: TheUser / TheProject.git
ศิวะ

2
วิธีการแก้ปัญหานี้ยังครอบคลุมถึงสถานการณ์เมื่อคุณต้องการใช้ git จากบัญชีโดยไม่ต้องไดเรกทอรีบ้าน
piotrekkr

น่าอัศจรรย์ คุณสามารถใช้วิธีนี้ไปยังเซิร์ฟเวอร์ส่วนตัวเกินไป:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
ตัน

1
นี่เป็นวิธีเดียวที่ทำงานสำหรับฉันในสภาพแวดล้อมที่ cygwin
ChatterOne

113

ด้วย git 2.10+ (ไตรมาสที่ 3 ปี 2559: เผยแพร่เมื่อวันที่ 2 ก.ย. 2559) คุณมีความเป็นไปได้ที่จะตั้งค่าคอนฟิกสำหรับGIT_SSH_COMMAND(และไม่ใช่แค่ตัวแปรสภาพแวดล้อมตามที่อธิบายไว้ในคำตอบของRober Jack Will )

ดูกระทำ 3c8ede3 (26 มิถุนายน 2016) โดยNguyễnTháiNgọc Duy (pclouds )
(ผสานโดยJunio ​​C Hamano - gitster- in กระทำ dc21164 , 19 กรกฎาคม 2559)

ตัวแปรการกำหนดค่าใหม่core.sshCommandถูกเพิ่มเข้ามาเพื่อระบุค่าที่GIT_SSH_COMMANDจะใช้ต่อที่เก็บ

core.sshCommand:

หากมีการตั้งค่าตัวแปรนี้git fetchและgit pushจะใช้คำสั่งที่ระบุแทนsshเมื่อพวกเขาต้องการเชื่อมต่อกับระบบระยะไกล
คำสั่งอยู่ในรูปแบบเดียวกับGIT_SSH_COMMANDตัวแปรสภาพแวดล้อมและถูกเขียนทับเมื่อตั้งค่าตัวแปรสภาพแวดล้อม

มันหมายความว่าgit cloneสามารถ:

cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git clone host:repo.git

คุณสามารถตั้งค่าได้ด้วยคำสั่งเดียว:

git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git

นี้เป็นเรื่องง่ายกว่าการตั้งค่าGIT_SSH_COMMANDตัวแปรสภาพแวดล้อมซึ่งบน Windows เป็นข้อสังเกตโดยMátyásกู-Kreszácsจะเป็น

set "GIT_SSH_COMMAND=ssh -i private_key_file"

@Flimm วันที่วางจำหน่าย: calendar.google.com/calendar/…
VonC

มันได้รับการปล่อยตัวออกมา
Flimm

4
โรงงาน ผู้คนควรพิจารณาคำตอบที่ดีที่สุดนี้ เมื่อออกแล้วจะสามารถให้ข้อมูลแตกต่างไฟล์. git / config ด้วยรุ่นที่คัดลอกไปยัง / tmp ก่อน มีการสร้างรายการใหม่: sshCommand = ... สำหรับสิ่งที่คุ้มค่าฉันใช้ 'git config core.sshCommand "ssh -i $ HOME / .ssh / privatekeyfile"
WeakPointer

1
@Spanky คุณสามารถทำคำสั่ง inline git -c core.sshCommand="ssh -i private_key_file" clone host:repo.gitแล้วตามด้วยชุดการตั้งค่าgit config core.sshCommand 'ssh -i private_key_file'
dav_i

1
นี่คือคำตอบที่ดีที่สุดอย่างแน่นอน!
Wagner Patriota

111

เพื่อสรุปคำตอบและความคิดเห็นวิธีที่ดีที่สุดในการตั้งค่า git เพื่อใช้ไฟล์คีย์ที่แตกต่างกันและลืมมันซึ่งสนับสนุนผู้ใช้ที่แตกต่างกันสำหรับโฮสต์เดียวกัน (เช่นบัญชี GitHub ส่วนบุคคลและที่ทำงานหนึ่ง) ซึ่งทำงานบน Windows เช่นกันคือการแก้ไข~/.ssh/config(หรือc:\Users\<your user>\.ssh\config) และระบุตัวตนหลายรายการ:

Host github.com
HostName github.com
IdentityFile /path/to/your/personal/github/private/key
User dandv

Host github-work
HostName github.com
IdentityFile /path/to/your/work/github/private/key
User workuser

จากนั้นเมื่อต้องการโคลนโครงการในฐานะผู้ใช้ส่วนตัวของคุณเพียงเรียกใช้งานปกติ git cloneคำสั่ง

การโคลน repo เป็นวิ่งworkusergit clone git@github-work:company/project.git


3
ฉันลงคะแนนให้คุณเพราะทุกสิ่งที่คุณพูดนั้นครอบคลุมอยู่ในคำตอบข้างต้นและในสายตาของฉันชัดเจนยิ่งขึ้น ยกตัวอย่างเช่นทำไมคุณถึงกำหนดผู้ใช้งานให้กับ e dandv และผู้ใช้งานตามลำดับ
hroptatyr

2
คุณตอบคำถามอายุ 4 ปีโดยไม่มีข้อมูลใหม่และคุณอ้างว่าคำตอบของคุณคือ "วิธีที่ดีที่สุด" ยิ่งไปกว่านั้นคุณยังได้ลดผู้ใช้คนอื่น ๆ และลบคำตอบออกไป ...
rudimeier

@hroptatyr: ฉันเคยใช้dandvและworkuserสนับสนุนตัวอย่างของฉัน "เช่นบัญชี GitHub ส่วนบุคคลและงานหนึ่ง" dandvเป็นชื่อผู้ใช้ GitHub ของฉัน
Dan Dascalescu

12
ฉันคิดว่ามันเป็นคำตอบที่ดีกว่า @ thamster ถ้าเพียงเพราะมันอธิบายถึงชื่อแทนโฮสต์
David Moles

2
ฉันชอบคำตอบนี้ อย่างไรก็ตามสำหรับฉันมันใช้งานได้เฉพาะถ้าฉันเพิ่มลงIdentitiesOnly yesในไฟล์ ssh config ของฉัน
winni2k

75

ตามที่ระบุไว้ที่นี่: https://superuser.com/a/912281/607049

คุณสามารถกำหนดค่าสำหรับแต่ละ repo:

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

1
อะไร-F /dev/nullทำอย่างไร เท่าที่ฉันเห็นสิ่งนี้จะเปลี่ยน configFile จาก~/.ssh/configค่าเริ่มต้น แต่ทำไมถึงเป็นที่ต้องการ? เพื่อให้มั่นใจว่าคำสั่ง sandboxed?
Dominic

3
linuxcommand.org/man_pages/ssh1.html , ไม่ได้ระบุไฟล์กำหนดค่า, ดังนั้นเมื่อ git จะเรียกใช้ ssh, ไฟล์ config จะไม่ถูกส่งผ่าน (อันที่จริงมันเป็นโหมดของ sandbox, ไม่ต้องสนใจตัวเลือกการตั้งค่าเริ่มต้นของผู้ใช้) ข้อมูลเพิ่มเติมเกี่ยวกับ -F
David

1
คนที่ฉันกำลังมองหา ขอบคุณ!
แพ้

โซลูชัน AAAAA + สำหรับการทำงานในสภาพแวดล้อม kuber ขอบคุณ!
งูเห่ากับนินจา

1
สวัสดีคุณรู้วิธีเผยแพร่สิ่งนี้ไปยัง submodule หรือไม่?
Arka Prava Basu

38

ปัญหาคือเมื่อคุณมีที่เก็บระยะไกลที่แตกต่างกันในโฮสต์เดียวกัน (พูด github.com) และคุณต้องการโต้ตอบกับพวกเขาโดยใช้คีย์ ssh ที่แตกต่างกัน (เช่นบัญชี GitHub ที่แตกต่างกัน)

ในการทำเช่นนั้น:

  1. ก่อนอื่นคุณควรประกาศรหัสที่แตกต่างใน~/.ssh/configไฟล์

    # Key for usual repositories on github.com
    Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa
    
    # Key for a particular repository on github.com
    Host XXX
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_other_rsa

    ในการทำเช่นนี้คุณจะต้องเชื่อมโยงคีย์ที่สองกับชื่อที่เป็นมิตรใหม่ "XXX" สำหรับ github.com

  2. จากนั้นคุณต้องเปลี่ยนแหล่งกำเนิดระยะไกลของที่เก็บเฉพาะของคุณเพื่อให้ใช้ชื่อที่จำง่ายที่คุณเพิ่งกำหนด

    ไปที่โฟลเดอร์ที่เก็บโลคัลของคุณภายในพร้อมต์รับคำสั่งและแสดงที่มารีโมตปัจจุบัน:

    >git remote -v
    origin  git@github.com:myuser/myrepo.git (fetch)
    origin  git@github.com:myuser/myrepo.git (push)

    จากนั้นเปลี่ยนต้นกำเนิดด้วย:

    >git remote set-url origin git@XXX:myuser/myrepo.git
    >git remote -v
    origin  git@XXX:myuser/myrepo.git (fetch)
    origin  git@XXX:myuser/myrepo.git (push)

    ตอนนี้คุณสามารถผลักดันดึง ... ด้วยปุ่มขวาโดยอัตโนมัติ


1
นี่คือคำตอบที่ "ถูกต้อง" ที่สุดในใจของฉันที่คุณจัดระเบียบการเชื่อมต่อและกุญแจในไฟล์ ssh config ของคุณซึ่งเป็นแนวปฏิบัติที่ดีที่สุดและสนับสนุนในระยะยาว
jamescampbell

โซลูชันอื่น ๆ ดูเหมือนจะมีวิธีแก้ปัญหานี่คือการใช้คุณสมบัติที่ยอดเยี่ยมที่เครื่องมือรองรับ
Craig.C

ยอดเยี่ยมสิ่งที่ฉันกำลังมองหาขอบคุณ !!
magikMaker

37
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo

หรือ

export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key"
git clone REPO
git push

อันนี้ใช้ได้สำหรับฉัน
mohammed_ayaz

36

ขอแนะนำให้เพิ่มโฮสต์หรือไอพีลงใน.ssh/configไฟล์ดังนี้:

Host (a space separated list of made up aliases you want to use for the host)
    User git
    Hostname (ip or hostname of git server)
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_(the key you want for this repo)

1
มีประโยชน์ แต่ทำให้คุณใช้คีย์ repo สำหรับการโต้ตอบทั้งหมดกับชื่อโฮสต์นั้น หากมี repos อื่น ๆ บนเซิร์ฟเวอร์เดียวกันที่ต้องใช้คีย์ที่แตกต่างกันการใช้ wrapper และบอกให้ git ใช้กับ GIT_SSH ดีกว่า
โจบล็อค

11
ไม่จำเป็นต้องเป็นเรื่องจริง ฉันใช้ปุ่มหลายปุ่มสำหรับ Github - หนึ่งปุ่มสำหรับทำงานและอีกปุ่มหนึ่งสำหรับบัญชีส่วนบุคคลของฉัน คุณไม่จำเป็นต้องใส่ชื่อโดเมนสำหรับ "โฮสต์" คุณสามารถใส่ชื่อแทนอะไรก็ได้ที่คุณต้องการ ตัวอย่างเช่นฉันใช้ gh-home และ gh-work เป็นชื่อโฮสต์ของฉันและเมื่อฉันโคลนฉันใช้ตัวอย่างเช่นgit clone git@gh-work:repo/project.git ใน ~ / .ssh / config ของฉันฉันมีสองส่วนที่ใช้ github.com สำหรับชื่อโฮสต์ พวกเขามี IdentityFile และ Host ที่แตกต่างกัน
13

@ brettof86 กลยุทธ์นี้ใช้งานได้เป็นส่วนใหญ่ แต่คุณจะทำอย่างไรเมื่อพื้นที่เก็บข้อมูลที่คุณกำลังตรวจสอบขึ้นอยู่กับอัญมณีซึ่งโฮสต์บน Github ด้วย? การอ้างอิงไปยัง gitub repo ใน Gemfile จะไม่มี "alias" ของคุณอยู่ดียกเว้นว่าคุณต้องการทำลายสิ่งต่าง ๆ สำหรับผู้พัฒนารายอื่นในโครงการ ...
ktec

@ brettof86 ฉันมีบัญชี Github สองบัญชีที่แตกต่างกัน (ทำงานที่บ้าน) แต่ฉันไม่สามารถรับตัวอย่างให้ฉันได้ คุณสามารถโพสต์ตัวอย่างของการมีสองคนได้หรือไม่?
Climbs_lika_Spyder

@Climbs_lika_Spyder นี่คือสิ่งที่อยู่ใน~/.ssh/config pastebin.com/8rYn7yCi
blockloop

32

ฉันไปกับตัวแปรสภาพแวดล้อม GIT_SSH นี่คือเสื้อคลุมของฉันคล้ายกับจาก Joe Block จากด้านบน แต่จัดการกับจำนวนอาร์กิวเมนต์ใด ๆ

ไฟล์ ~ / gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"

จากนั้นใน. bashrc ของฉันเพิ่มสิ่งต่อไปนี้:

export GIT_SSH=~/gitwrap.sh

ฉันตั้งค่านี้เป็น. bashrc แต่เมื่อฉันลงชื่อเข้าใช้อินสแตนซ์ของระบบเปิดดูเหมือนว่าจะไม่โทรมา ฉันพลาดอะไรไปรึเปล่า ?
Jigar Shah

มันล้มเหลวด้วยข้อผิดพลาดสำหรับฉัน .. มันไม่สามารถค้นหาเหตุการณ์ของสคริปต์แม้ว่าจะมี .. ไม่แน่ใจว่าเกิดอะไรขึ้น ... ข้อผิดพลาด: ไม่สามารถเรียกใช้ /tmp/gitwrap.sh: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ap1234

หากคุณพบข้อผิดพลาด "ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว" ให้ใส่เส้นทางแบบเต็มของgitwrap.shเช่น/home/ubuntu/gitwrap.sh
Tahir Akhtar

คุณอาจต้องการเพิ่ม-o StrictHostKeyChecking=noคำสั่ง ssh
dan-man

12

หากไม่มีวิธีแก้ไขปัญหาอื่นที่นี่ใช้ได้สำหรับคุณและคุณได้สร้าง ssh-keys หลายรายการ แต่ก็ยังไม่สามารถทำสิ่งต่าง ๆ ได้อย่างง่าย

git pull

จากนั้นสมมติว่าคุณมีไฟล์คีย์ ssh สองไฟล์เช่น

id_rsa
id_rsa_other_key

จากนั้นภายใน repo คอมไพล์ลอง:

# Run these commands INSIDE your git directory
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

และตรวจสอบให้แน่ใจว่าชื่อผู้ใช้เริ่มต้น github และหมายเลขผู้ใช้ของคุณถูกต้องโดย:

# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "mona.lisa@email.com"

ดูhttps://gist.github.com/jexchan/2351996สำหรับข้อมูลเพิ่มเติม


หมายเหตุถ้าคุณได้รับCould not open a connection to your authentication agent.ลอง$ eval `ssh-agent -s`และลองอีกครั้ง
cgnorthcutt

1
สำหรับผู้ที่หลงทางssh-addเคล็ดลับคำสั่งนั้นใช้ได้ผลสำหรับฉัน เพิ่มเป็นรหัสประจำตัวไปยังรายการของรหัสที่จะลองเมื่อ ssh ตรวจสอบสิทธิ์ มันใช้งานได้ดีสำหรับฉัน!
Ben Cartwright

ทำไมคุณคิดว่ามันเป็นเรื่องสำคัญที่คุณเรียกใช้ไดเรกทอรีssh-add?
tripleee

@BenCartwright เนื่องจากคุณกำลังแก้ไขการตั้งค่าในพื้นที่ไม่ใช่การตั้งค่าร่วม วิธีการนี้จะแก้ไข.gitภายใน repo ไม่ใช่โปรแกรม git ทั่วโลก คุณสามารถใช้--globalเพื่อตั้งชื่อผู้ใช้และอีเมลส่วนกลาง
cgnorthcutt

11

เมื่อคุณจำเป็นต้องเชื่อมต่อกับ GitHub ที่มีการร้องขอปกติ ( git pull origin master), การตั้งค่าโฮสต์เป็น*ใน~/.ssh/configการทำงานสำหรับฉันโฮสต์อื่น ๆ (พูดว่า "GitHub" หรือ "GB") ไม่ได้ทำงาน

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx

อาจปล่อยให้บรรทัด "Host *" ทั้งหมดออกไป
lionello

1
อาจไม่ทำงานเนื่องจากไม่ตรงกับ URL ระยะไกลของคุณ หากคุณต้องการใช้งานคุณจะต้องตั้งค่าHost my-host-alias remote.origin.url=git@my-host-alias:[username]/[repo].git
David Moles

11

วิธีแก้ปัญหาเหล่านี้ดูน่าหลงใหล อย่างไรก็ตามฉันพบวิธีการทั่วไป git-wra-script ที่ลิงค์ต่อไปนี้เป็นประโยชน์มากที่สุด:

วิธีการระบุไฟล์คีย์ ssh ด้วยgitคำสั่ง

จุดที่ไม่มีgitคำสั่งดังต่อไปนี้:

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

โซลูชันของ Alvin คือการใช้สคริปต์ bash-wrapper ที่กำหนดไว้อย่างดีซึ่งเติมช่องว่างนี้:

git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

อยู่ที่ไหนgit.sh:

#!/bin/bash

# The MIT License (MIT)
# Copyright (c) 2013 Alvin Abad
# https://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command

if [ $# -eq 0 ]; then
    echo "Git wrapper script that can specify an ssh-key file
Usage:
    git.sh -i ssh-key-file git-command
    "
    exit 1
fi

# remove temporary file on exit
trap 'rm -f /tmp/.git_ssh.$$' 0

if [ "$1" = "-i" ]; then
    SSH_KEY=$2; shift; shift
    echo "ssh -i $SSH_KEY \$@" > /tmp/.git_ssh.$$
    chmod +x /tmp/.git_ssh.$$
    export GIT_SSH=/tmp/.git_ssh.$$
fi

# in case the git command is repeated
[ "$1" = "git" ] && shift

# Run the git command
git "$@"

ผมสามารถยืนยันได้ว่านี้แก้ปัญหาผมมีกับผู้ใช้รับรู้คีย์ / สำหรับ repo bitbucket ระยะไกลด้วยgit remote update, git pullและgit clone; ตอนนี้ทั้งหมดทำงานได้ดีในcronสคริปต์งานที่มีปัญหาในการนำทางเชลล์ จำกัด ฉันยังสามารถเรียกสคริปต์นี้จากภายใน R และยังคงแก้ปัญหาการcronเรียกใช้งานที่แน่นอน(เช่นsystem("bash git.sh -i ~/.ssh/thatuserkey.pem pull") )

ไม่ใช่ว่า R จะเหมือนกับ Ruby แต่ถ้า R สามารถทำได้ ... O :-)


1
ดูเหมือนดีมาก! ฉันจะทดสอบสิ่งนี้และตอบกลับ
BlueBird

3
นอกเหนือจากไวยากรณ์วิธีนี้จะดีกว่าGIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone thatuser@myserver.com:/git/repo.gitเป็นต่อคำตอบของโรเบิร์ตแจ็คจะเป็น ?
David Moles

6

หากคุณมีไดเร็กทอรีบนพา ธ ของคุณที่คุณต้องการลงชื่อด้วย identfile ที่กำหนดคุณสามารถระบุเพื่อใช้ไฟล์ระบุเฉพาะผ่านไฟล์. ssh / config โดยการตั้งค่าControlPathเช่น:

host github.com
  ControlPath ~/Projects/work/**
  HostName github.com
  IdentityFile ~/.ssh/id_work
  User git

จากนั้นsshจะใช้ไฟล์ข้อมูลประจำตัวที่ระบุเมื่อทำคำสั่ง git ภายใต้เส้นทางงานที่กำหนด


พบในภายหลังว่าคุณสามารถตั้งค่าคุณสมบัติControlMaster autoและControlPersist yesเพื่อให้คุณไม่จำเป็นต้องพิมพ์รหัสผ่านซ้ำทุกครั้ง พบข้อมูลในบทความนี้
cristobal

3

คุณต้องสร้าง ~ / .ssh / config ดังนี้

Host <Your bitbucket server>
User <userid>
Hostname <Your bitbucket server as above>
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa<file> This is your private key file

การอนุญาตดังต่อไปนี้

-rw------- $HOME/.ssh/config

เพิ่มกุญแจสาธารณะของคุณลงในคอมไพล์ของคุณ (cat ~ / .ssh / id_rsa_pub [หรือชื่อ simillar])

จากนั้นคอมไพล์ git ดังนี้

git clone ssh://blahblah@blah.com/userid/test.git

3

คำตอบที่ดีมาก แต่บางคนคิดว่าความรู้การบริหารก่อนหน้านี้

ฉันคิดว่ามันเป็นสิ่งที่สำคัญอย่างชัดเจนเน้นว่าถ้าคุณเริ่มโครงการของคุณโดยการโคลน URL เว็บ - https://github.com/<user-name>/<project-name>.git
แล้วคุณจะต้องให้แน่ใจว่าurl คุ้มค่าภายใต้[remote "origin"]ใน.git/config ก็เปลี่ยนเป็น SSH URL (ดูรหัสบล็อกด้านล่าง)

นอกจากนั้นให้แน่ใจว่าคุณเพิ่มsshCommmandดังกล่าวข้างล่าง:

user@workstation:~/workspace/project-name/.git$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    sshCommand = ssh -i ~/location-of/.ssh/private_key -F /dev/null <--Check that this command exist
[remote "origin"]
    url = git@github.com:<user-name>/<project-name>.git  <-- Make sure its the SSH URL and not the WEB URL
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

อ่านข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่


1
ขอบคุณมากใช้เวลาพยายามหาสาเหตุว่าทำไมคอมไพล์ไม่ใช้คีย์ ssh ฉันไม่เข้าใจว่าทำไม github จึงให้ https URL เป็นค่าเริ่มต้นในปุ่มโคลน
Chakradar Raju

2

ใน Windows ที่มี Git Bash คุณสามารถใช้รายการต่อไปนี้เพื่อเพิ่มที่เก็บ ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"' ตัวอย่าง: ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git'คีย์ส่วนตัวใดที่อยู่ในไดรฟ์ D ทดสอบโฟลเดอร์ของคอมพิวเตอร์ นอกจากนี้หากคุณต้องการที่จะโคลนพื้นที่เก็บข้อมูลคุณสามารถเปลี่ยนด้วยgit remote add origingit clone

หลังจากป้อนสิ่งนี้ใน Git Bash มันจะถามคุณสำหรับวลีรหัสผ่าน!

จงระวังให้ดีที่ openssh คีย์ส่วนตัวและ putty ไพรเวตคีย์มีความหลากหลาย!

หากคุณสร้างคีย์ด้วย puttygen คุณต้องแปลงคีย์ส่วนตัวเป็น openssh!


1

คุณสามารถใช้ตัวแปรสภาพแวดล้อม GIT_SSH แต่คุณจะต้องล้อม ssh และตัวเลือกไว้ในเชลล์สคริปต์

ดูคู่มือ git: man gitในเชลล์คำสั่งของคุณ


1

ฉันใช้zshและปุ่มที่แตกต่างกันถูกโหลดไปยัง zsh shell ของฉันssh-agentโดยอัตโนมัติเพื่อวัตถุประสงค์อื่น (เช่นการเข้าถึงเซิร์ฟเวอร์ระยะไกล) บนแล็ปท็อปของฉัน ฉันแก้ไขคำตอบของ @ Nick และฉันใช้มันสำหรับหนึ่งใน repos ของฉันที่ต้องได้รับการรีเฟรชบ่อยครั้ง (ในกรณีนี้มันเป็นของฉันdotfilesที่ฉันต้องการรุ่นเดียวกันและรุ่นล่าสุดในทุกเครื่องของฉันทุกที่ที่ฉันทำงาน)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'
  • วางไข่ ssh-agent
  • เพิ่มคีย์อ่านอย่างเดียวไปยังเอเจนต์
  • เปลี่ยนไดเรกทอรีเป็น repo git ของฉัน
  • หากcdต้องการ repo dir สำเร็จให้ดึงจาก repo ระยะไกล
  • ฆ่า ssh-agent ที่เกิดใหม่ (ฉันไม่ต้องการตัวแทนจำนวนมากที่รออยู่)


1

หากต้องการให้ตัวแปรสภาพแวดล้อม GIT_SSH_COMMAND ทำงานภายใต้ Windows แทน:

set GIT_SSH_COMMAND="ssh -i private_key_file"

ใช้:

set "GIT_SSH_COMMAND=ssh -i private_key_file"

คำพูดจะต้องเป็นเช่นนั้น

set "variable=value" 

แบคกราวด์บางส่วน: https://stackoverflow.com/a/34402887/10671021


0

หากหมายเลขพอร์ต SSH ไม่ได้ 22 (ค่าเริ่มต้น), เพิ่มPort xxใน~/.ssh/config

ในกรณีของฉัน (synology)

Host my_synology
    Hostname xxxx.synology.me
    IdentityFile ~/.ssh/id_rsa_xxxx
    User myname
    Port xx

จากนั้นโคลนโดยใช้ชื่อโฮสต์ในการกำหนดค่า ("my_synology". เพื่อหลีกเลี่ยง @chopstik 's "*")

git clone my_synology:path/to/repo.git

0

หากคุณเป็นเหมือนฉันคุณสามารถ:

  • จัดระเบียบคีย์ ssh ของคุณ

  • ทำให้คำสั่ง git clone ของคุณง่ายขึ้น

  • จัดการกับจำนวนของคีย์ใด ๆ สำหรับจำนวนที่เก็บใด ๆ

  • ลดการบำรุงรักษาคีย์ ssh ของคุณ

ฉันเก็บกุญแจไว้ในใจ ~/.ssh/keysไดเรกทอรี

ฉันชอบการประชุมมากกว่าการตั้งค่า

ฉันคิดว่ารหัสเป็นกฎหมาย ง่ายกว่าก็คือยิ่งดี

ขั้นตอนที่ 1 - สร้างนามแฝง

เพิ่มนามแฝงนี้ลงในเชลล์ของคุณ: alias git-clone='GIT_SSH=ssh_wrapper git clone'

ขั้นตอนที่ 2 - สร้างสคริปต์

เพิ่มสคริปต์ssh_wrapperนี้ใน PATH ของคุณ:

#!/bin/bash
# Filename: ssh_wrapper

if [ -z ${SSH_KEY} ]; then
    SSH_KEY='github.com/l3x'  # <= Default key
fi
SSH_KEY="~/.ssh/keys/${SSH_KEY}/id_rsa"
ssh -i "${SSH_KEY}" "$@"

ตัวอย่าง

ใช้คีย์ github.com/l3x:

KEY=github.com/l3x git-clone https://github.com/l3x/learn-fp-go

ตัวอย่างต่อไปนี้ยังใช้คีย์github.com/l3x (โดยค่าเริ่มต้น):

git-clone https://github.com/l3x/learn-fp-go

ใช้ bitbucket.org/lsheehan คีย์:

KEY=bitbucket.org/lsheehan git-clone git@bitbucket.org:dave_andersen/exchange.git

หมายเหตุ

เปลี่ยน SSH_KEY เริ่มต้นในสคริปต์ ssh_wrapper เป็นสิ่งที่คุณใช้เป็นส่วนใหญ่ ด้วยวิธีนี้คุณไม่จำเป็นต้องใช้ตัวแปร KEY เป็นส่วนใหญ่

คุณอาจคิดว่า "เฮ้! สิ่งนี้เกิดขึ้นมากมายกับนามแฝงสคริปต์และไดเร็กตอรี่ของกุญแจ" แต่สำหรับฉันมันเป็นแบบแผน เกือบทุกเวิร์กสเตชันของฉัน (และเซิร์ฟเวอร์สำหรับเรื่องนั้น) มีการกำหนดค่าในทำนองเดียวกัน

เป้าหมายของฉันที่นี่คือทำให้คำสั่งที่ฉันใช้งานเป็นประจำง่ายขึ้น

ข้อตกลงของฉันเช่นสคริปต์ทุบตีนามแฝง ฯลฯ สร้างสภาพแวดล้อมที่สอดคล้องกันและช่วยให้ฉันเรียบง่าย

จูบและชื่อมีความสำคัญ

สำหรับเคล็ดลับการออกแบบเพิ่มเติมดูบทที่ 4 การออกแบบ SOLID ใน Goจากหนังสือของฉัน: https://www.amazon.com/Learning-Functional-Programming-Lex-Sheehan-ebook/dp/B0725B8MYW

หวังว่าจะช่วย - ไฟแนนเชี่ยล



0

ปัญหาเกี่ยวกับวิธีการนี้คืออย่างน้อยเมื่อใช้งานโดย bash.exe บน Windows ว่ามันจะสร้างกระบวนการใหม่ทุกครั้งที่ยังคงอยู่เฉยๆ

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

หากคุณต้องการที่จะใช้สำหรับซิงค์ repo ตามกำหนดเวลาคุณต้องเพิ่ม "&& ssh-agent -k" ในตอนท้าย

สิ่งที่ต้องการ:

ssh-agent bash -c 'ssh-add C:/Users/user/.ssh/your_key; git -C "C:\Path\to\your\repo" pull && ssh-agent -k' 

ssh-agent -k จะฆ่ากระบวนการเมื่อเสร็จสิ้น


0

ฉันแค่ต้องการเพิ่มคีย์จากนั้นเรียกใช้ git clone อีกครั้ง

ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git

-1

นี่คือ ssh key hack ที่ฉันพบขณะค้นหาวิธีแก้ไขปัญหานี้:

ตัวอย่างเช่นคุณมีชุดกุญแจ 2 ชุดที่แตกต่างกัน:

key1, key1.pub, key2, key2.pub

เก็บคีย์เหล่านี้ไว้ใน.sshไดเรกทอรีของคุณ

ตอนนี้ในไฟล์.bashrcหรือ.bash_profileนามแฝงของคุณเพิ่มคำสั่งเหล่านี้

alias key1='cp ~/.ssh/key1 id_rsa && cp ~/.ssh/key1.pub id_rsa.pub'

alias key2='cp ~/.ssh/key2 id_rsa && cp ~/.ssh/key2.pub id_rsa.pub'

Voila! คุณมีทางลัดเพื่อสลับคีย์ทุกครั้งที่คุณต้องการ!

หวังว่านี่จะเป็นประโยชน์สำหรับคุณ

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