ผ่านตัวเลือก ssh เพื่อ git clone


106

ฉันกำลังพยายามรันgit cloneโดยไม่ให้ ssh ตรวจสอบคีย์ของโฮสต์ที่เก็บ ฉันสามารถทำได้จาก ssh เช่นนั้น:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@host

มีวิธีใดบ้างในการส่งผ่านตัวเลือก ssh เดียวกันไปยังคำสั่ง git clone?

แก้ไข: มีข้อ จำกัด ที่ฉันไม่สามารถแก้ไข~/.ssh/configหรือไฟล์อื่น ๆ บนเครื่องนั้นได้


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

1
อันที่จริงสิ่งนี้มักเป็นสิ่งที่คุณต้องการทำ คุณมี repo ภายใน หากมีใครสามารถสวมรอยได้แสดงว่าคุณมีปัญหา มันไม่ "เสี่ยงมาก" เลย ในความเป็นจริงคุณทำการตรวจสอบคีย์โฮสต์แบบไม่อยู่ในขอบเขตบ่อยเพียงใด (คุณควรจะ).
Graham Nicholls

คำตอบ:


47

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

Host host
    HostName host
    User user
    SshOption1 Value1
    SshOption2 Value2

Hostรายการคือสิ่งที่คุณจะต้องระบุในบรรทัดคำสั่งและHostNameเป็นชื่อโฮสต์จริง อาจเหมือนกันหรือHostรายการอาจเป็นนามแฝงก็ได้ Userรายการจะใช้ในกรณีที่คุณไม่ได้ระบุuser@ในบรรทัดคำสั่ง

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


4
ฉันลืมบอกไปว่าฉันไม่สามารถแก้ไขไฟล์ใด ๆ บนเครื่องนั้นได้ มิฉะนั้นวิธีแก้ปัญหาของคุณจะได้ผล
Daniel

28
ใช้GIT_SSHตัวแปรสภาพแวดล้อม
Josh Lee

160

git 2.3 ที่เพิ่งเปิดตัวล่าสุดรองรับตัวแปรใหม่ "GIT_SSH_COMMAND" ซึ่งสามารถใช้เพื่อกำหนดคำสั่งกับพารามิเตอร์

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@host

$GIT_SSH_COMMANDมีความสำคัญเหนือกว่า$GIT_SSHและตีความโดยเชลล์ซึ่งทำให้สามารถรวมอาร์กิวเมนต์เพิ่มเติมได้


ควรขึ้นบรรทัดใหม่ก่อนgit cloneหรือรหัสถูกต้อง?
Tomáš Zato - คืนสถานะ Monica

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

ขอบคุณฉันติดปัญหานี้มา 2 วันแล้ว!
James Gentes

บูย่า! ขอบคุณ.
Jasper Blues

มันจะใช้ไม่ได้กับ git 1.9 รุ่นที่ฉันเชื่อมีทางเลือกอื่นสำหรับ git 1.9 หรือไม่
lazarus

34

อีกทางเลือกหนึ่งที่สร้างขึ้นเพื่อระบุคีย์ต่างๆคือgit config core.sshCommandgit 2.10 + (Q3 2016)

นี่เป็นทางเลือกสำหรับตัวแปรสภาพแวดล้อมที่อธิบายไว้ในคำตอบของBoris )

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

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

คล้ายกับ$GIT_ASKPASSหรือ$GIT_PROXY_COMMANDเราอ่านจากไฟล์ config ก่อนจากนั้นถอยกลับไปที่$GIT_SSH_COMMAND.

สิ่งนี้มีประโยชน์สำหรับการเลือกคีย์ส่วนตัวที่แตกต่างกันโดยกำหนดเป้าหมายโฮสต์เดียวกัน (เช่น github)

core.sshCommand:

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

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

cd /path/to/my/repo
git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' 
# later on
git clone host:repo.git

หากคุณต้องการใช้กับrepos ทั้งหมดตามที่user1300959เพิ่มในความคิดเห็นคุณจะต้องใช้การกำหนดค่าส่วนกลาง

git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

3
เป็นไปได้มากกว่าที่คุณจะยังไม่มี repo เนื่องจากคุณทำgit clone- ในกรณีนี้คุณอาจต้องการกำหนดค่าคำสั่ง git ssh ทั่วโลก:git config --global core.sshCommand ...
iurii

@ user1300959 ดีครับขอบคุณครับ ฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบเพื่อให้มองเห็นได้มากขึ้น
VonC

นี่คือคำตอบที่ดีที่สุด
MikeSchinkel

ในส่วนสุดท้ายคุณจะขาดเครื่องหมายวรรคตอน
Luigi Lopez

@LuigiLopez คุณสามารถแก้ไขคำตอบได้หรือไม่? ฉันจะตรวจสอบการแก้ไขของคุณ
VonC

22

นี่คือตัวอย่างที่ยุ่งยากในการส่งอาร์กิวเมนต์ ssh โดยใช้ตัวแปร GIT_SSH:

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

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

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


ดี! คำถาม: ทั้งสองอย่าง$*และ"$@"ดูเหมือนจะใช้ได้ผล โดยปกติฉันใช้"$@"เนื่องจากอีกอันดูเหมือนเลิกใช้แล้ว มีเหตุผลที่จะชอบ$*ในกรณีนี้หรือไม่?
mh8020

18

การกำหนดค่าระดับพื้นที่เก็บข้อมูลโดยไม่ส่งผลกระทบต่อการตั้งค่าระดับระบบ

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

1. โคลนที่เก็บโดยใช้GIT_SSH_COMMANDแนวทาง

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone ssh://url

2. เมื่อโคลนแล้วให้ไปที่ไดเร็กทอรีที่เก็บ

cd repo-dir

3. core.sshCommandตั้งค่าการกำหนดค่าเพื่อให้สามารถเรียกใช้การโทรในอนาคตด้วยคำสั่ง git ได้ตามปกติ แต่ใช้ตัวเลือก git ที่มีให้ภายใน

git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

1
การใช้งานที่ดีcore.sshCommandที่ฉันกล่าวถึงข้างต้น โหวตแล้ว
VonC

6

ฉันคิดว่าการอัปเดต git เป็นเวอร์ชัน> = 2.3 และการใช้งานGIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@hostเป็นตัวเลือกการเดิมพัน แต่ถ้าเป็นไปไม่ได้ @ josh-lee ให้ตัวเลือกที่ดี แต่โปรดอัปเดตคำตอบของคุณโดยการเยื้องไฟล์กำหนดค่า ssh

Host host
    HostName host
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

0

ปัญหานี้ได้รับการแก้ไขแล้วโดยทำตามขั้นตอนใน Window machine: -

  • สร้างไฟล์กำหนดค่าภายใต้โฟลเดอร์ C: \ Users \ username.ssh

  • เพิ่มบรรทัดต่อไปนี้ในไฟล์ config

    host <HOST>
    hostname <HOSTNAME>
    user <USER_NAME>
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    port <PORT_NUMBER>
    KexAlgorithms +diffie-hellman-group1-sha1
    
  • แล้วลองอีกครั้ง

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