วิธีการ ssh ไปยังคนเร่ร่อนโดยไม่เรียกใช้ "คนจรจัด ssh" จริง ๆ ?


149

ฉันอยากจะทำซ้ำวิธีที่ Vagrant บันทึกลงใน VM ของฉันภายในเชลล์สคริปต์โดยใช้sshคำสั่งดังนั้นฉันจึงสร้างนามแฝงในอินสแตนซ์ Vagrant ของฉัน

ไวยากรณ์คำสั่งเพื่อใช้sshคำสั่งปกติเพื่อเข้าถึงมันคืออะไร?


สิ่งที่คุณถามจริง ๆ ฉันเห็นสิ่งที่แตกต่างกันสามสิ่งที่ถูกถามบางทีคุณอาจขยายคำถามแล้วตั้งค่าสถานะให้ย้ายข้อมูล ขอบคุณ
Kev

3
โดยค่าเริ่มต้นพอร์ต ssh ของ VM ซึ่งเป็น -22 จะถูกส่งต่อไปยัง 2222 บนเครื่องโฮสต์ ฉัน putty-ed ที่ 127.0.0.1 และพอร์ต 2222 กับ SSH และมันใช้งานได้!
Vishal Biyani

8
หากคุณใช้มากกว่าหนึ่งช่องหมายเลขพอร์ตนั้นจะเปลี่ยนโดยอัตโนมัติ vagrant ssh-configคุณจะได้รับหนึ่งที่เหมาะสมโดยการเรียกใช้
Stefano Palazzo

คำตอบ:


108

ฉันต้องนำ "vagrant ssh" ไปใช้อีกครั้งเพราะ-cตัวเลือกของมันไม่ผ่านการขัดแย้งอย่างเหมาะสม นี่คือโดยทั่วไปสิ่งที่มันไม่ (อาจจะมีมากขึ้น แต่ก็ทำงานได้ดีด้วยวิธีนี้)

#!/bin/sh
PORT=$(vagrant ssh-config | grep Port | grep -o '[0-9]\+')
ssh -q \
    -o UserKnownHostsFile=/dev/null \
    -o StrictHostKeyChecking=no \
    -i ~/.vagrant.d/insecure_private_key \
    vagrant@localhost \
    -p $PORT \
    "$@"

ในฐานะหนึ่งซับ (ด้วย kgadek):

ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost

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

HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' |  awk 'NR>1 {print " -o "$1"="$2}') localhost

3
คำตอบนี้ไม่อนุญาตให้คุณsshไปยัง Vagrant ของคุณจากนอกVagrantfileไดเรกทอรี ("ใช้sshคำสั่งปกติ") ซึ่งเป็นวิธีที่ฉันตีความคำถาม
sjy

คุณสามารถตั้งค่าพอร์ตด้วยตัวคุณเอง ดังนั้นสคริปต์จะสามารถเรียกใช้จากไดเรกทอรีใด ๆ
Yser

แล้วอะไรที่ทำให้พอร์ตนั้นเป็นวิธีในการเข้าถึงเครื่อง การกำหนดค่าของพอร์ตใดอยู่ที่ไหน
nroose

1
คนจรจัดเลือกหนึ่งที่ไม่ได้ใช้กับการauto_correct: trueตั้งค่า ต่อไปนี้เป็น ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเปลี่ยนด้วยตนเอง
สเตฟาโน Palazzo

1
ฉันต้องข้ามบรรทัดแรกเช่น Hostรายการ คำสั่งที่แก้ไขคือ:ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
kgadek

148

มีคำตอบมากมายอยู่แล้ว แต่พวกเขาดูเหมือนจะซับซ้อนเกินไปหรือแก้ปัญหาที่ผู้ถามไม่ได้มี

เพียง:

# save the config to a file
vagrant ssh-config > vagrant-ssh

# run ssh with the file.
ssh -F vagrant-ssh default

2
นั่นช่างยอดเยี่ยม ใจเพิ่มไฟล์ในvagrant-ssh .gitignore
sashaegorov

5
กับบางส่วนเปลือกหอย (เช่นzsh) ดังต่อไปนี้งานหนึ่งซับ:ssh -F =(vagrant ssh-config) default
liori

4
คุณอาจต้องการ echo ผลลัพธ์นี้ลงในsshไฟล์ config ของคุณ: vagrant ssh-config >> ~/.ssh/configดังนั้นคุณจึงเรียกใช้ssh defaultจากที่ใดก็ได้ในระบบของคุณซึ่งdefaultเป็นชื่อของ VM ที่คุณสามารถระบุได้ที่นี่
adamczi

ขอบคุณ @adamczi นี่เป็นวิธีที่ง่ายซึ่งทำงานกับโซลูชันอัตโนมัติโดยที่การเพิ่มพารามิเตอร์ ssh -Fไม่ตรงไปตรงมา
laimison

3
โดยการเพิ่มรายการ~/.ssh/configในวิธี @adamczi แนะนำให้คุณสามารถใช้ Visual Studio Code Remote - ส่วนขยาย SSH เพื่อ ssh ใน Vagrant VM และแก้ไขไฟล์และทำการพัฒนาระยะไกล เพียงแค่ CMD-SHIFT-P ตามด้วย "Remote-SSH: เชื่อมต่อกับโฮสต์ ... " และรายการ ssh .config ที่คุณเพิ่งเพิ่มจะถูกแสดงโดยอัตโนมัติ - คุณเพียงแค่เลือกมันและ voila, vscode เชื่อมต่อกับ vm คนจรจัดระยะไกลของคุณ! หากไม่มีวิธีการตั้งค่าฉันไม่แน่ใจว่าฉันจะใช้ vscode ได้ยังไง
abulka

52

ในการทำงานของเครื่อง

vagrant ssh

ในหน้าต่างเทอร์มินัล / การทำงานของแท็บอื่น

ps aux | grep ssh

คุณจะเห็นคำสั่งจริงที่ดำเนินการโดย Vagrant ซึ่งมีลักษณะดังนี้:

ssh vagrant@127.0.0.1 -p 2222 -o Compression=yes -o DSAAuthentication=yes -o LogLevel=FATAL -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -i ~/.vagrant.d/less_insecure_private_key -o ForwardAgent=yes

เคล็ดลับที่ยอดเยี่ยมหากคุณต้องการโฮสต์ของคนจรจัดของคุณสำหรับ ssh ด้วยเหตุผลอื่นเช่นการเชื่อมต่อ SQL GUI เช่น Sequel Pro อันนี้ช่วยฉันที!
Atomox

19

เพียงส่งไฟล์ทั้งหมดvagrant ssh-configเป็นไฟล์sshกำหนด-F configfileค่าด้วยพารามิเตอร์ นามแฝงโฮสต์ที่จะเชื่อมต่อกับถูกกำหนดไว้ในบรรทัดแรกในvagrant ssh-config; หมายความว่าคุณสามารถเชื่อมต่อกับHost defaultssh default

ฉันไม่เห็นตัวเลือกในการอ่านไฟล์กำหนดค่าจากอินพุตมาตรฐานดังนั้นจึงไปกับเส้นทางไฟล์ temp ต่อไปนี้เป็นไฟล์ซับเดียวที่ล้าง$TMPDIR.vagrant-ssh-configไฟล์ชั่วคราวในภายหลัง มันจะต้องมีการดำเนินการในไดเรกทอรีเดียวกับของคุณVagrantfileสมมติว่าคุณคนจรจัดกล่องขึ้นและทำงาน

vagrant ssh-config > $TMPDIR.vagrant-ssh-config && ssh default -F $TMPDIR.vagrant-ssh-config ; rm $TMPDIR.vagrant-ssh-config

หมายเหตุ: ในระบบ Mac OSX ของฉันให้$TMPDIRขยายเป็น/var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/(ตอนนี้) ใช้ตัวแปรอื่น หรือโฟลเดอร์อื่นหากไม่ได้ตั้งค่าไว้ในระบบของคุณ


3
หากคุณใช้ bash หรือ zsh การทดแทนโปรเซสเป็นวิธีที่ง่ายกว่าในการส่งเอาต์พุตของคำสั่งหนึ่งไปยังอีกคำสั่ง bash: ssh -F <(vagrant ssh-config) zsh: การทดแทนกระบวนการ zsh ssh -F =(vagrant ssh-config)
myeeshen

@myshen: ตามคำตอบของการแทนที่กระบวนการ@tyrionไม่ทำงานssh -Fในการทุบตี - วิธีที่คุณพูดถึงควรจะทำงานใน zsh
Joel Purra

แดงฉันต้องเรียนรู้วิธีใช้งานคนจรจัดจริง ๆ ไม่ต้องพูดถึงทุบตี
Spencer Williams

14

ฉันแก้ไขมันในวิธีที่ง่ายมาก: เมื่อคุณเริ่มกล่องคนจรจัดมันแสดงที่อยู่ ssh เช่นนี้

SSH address: 127.0.0.1:2222

จากนั้นคุณสามารถเชื่อมต่อกับกล่องโดยใช้ผู้ใช้คนจรจัดโฮสต์และพอร์ตที่คุณได้รับ

ssh vagrant@127.0.0.1 -p 2222

1
ดี! และโปรดทราบว่าโดยทั่วไปรหัสผ่านสำหรับผู้ใช้คนจรจัดคือvagrant
Brad Parks

7

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

vagrant ssh-config --host default | ssh -F /dev/stdin default

แนะนำวิธีนี้ในการตอบคำถามที่คล้ายกันในกลุ่ม googleกลุ่ม

น่าเสียดายที่การทดแทนกระบวนการทุบตีไม่ทำงาน (ดูคำถามนี้ในunix.stackexchangeสำหรับรายละเอียดเพิ่มเติม)

ตัวเลือกที่ดีที่สุดที่คุณมีหากคุณต้องการเชลล์แบบโต้ตอบคือการสร้างไฟล์ชั่วคราวและใช้มันด้วยssh -Fหรือใช้awkตามคำแนะนำอื่น ๆ


5

หากคุณต้องการตั้งค่าเพื่อให้คุณสามารถใช้บรรทัดคำสั่ง ssh ปกติเช่นเดียวกับ scp และเช่นนั้นคุณสามารถเรียกใช้vagrant ssh-configและผนวกเอาท์พุทกับการกำหนดค่า ssh เริ่มต้นของคุณ หากคุณแทนที่บรรทัด "โฮสต์เริ่มต้น" ด้วยชื่อโฮสต์ที่มีความหมายมากขึ้นคุณควรจะไปได้ดี

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box

สิ่งที่แพทย์สั่ง ...
xenoid

4

หากคุณต้องการให้คำสั่งขั้นต่ำเปล่าเชื่อมต่อกับกล่องของคุณคุณต้องรู้พอร์ตที่ใช้ (พิมพ์เมื่อทำvagrant upหรือมองเห็นได้vagrant ssh-config) และตำแหน่งของคีย์ SSH ส่วนตัวของคุณ (มองเห็นได้ด้วยเมื่อทำvagrant ssh-config)

จากนั้นเป็นเพียงเรื่องของการจัดหาคีย์และพอร์ต:

ssh -p 2222 -i $HOME/vagrantenv/.vagrant/machines/default/virtualbox/private_key vagrant@127.0.0.1


4

คำตอบอื่น ๆ มากมายคิดว่าคุณติดตั้ง Vagrant แล้ว

ฉันติดตั้ง Vagrant ใน Windows 10 แล้ว แต่ฉันทำไม่ได้vagrant sshเพราะฉันใช้ PuTTy เป็นลูกค้า SSH ของฉันซึ่งคนจรจัดจะไม่ยอมรับ

sshพบปฏิบัติการในเส้นทางเป็นลูกค้าฉาบเชื่อมโยง SSH Vagrant เข้ากันได้กับไคลเอนต์ OpenSSH SSH เท่านั้น

อย่างไรก็ตามใน Windows 10 เรายังมี Bash บน Ubuntu บน Windows ดังนั้นฉันแค่ใช้มันด้วยคำสั่งต่อไปนี้:

ssh vagrant@127.0.0.1 -p2222 -i .vagrant/machines/default/virtualbox/private_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=Fatal

มันง่ายพอที่จะติดตั้ง Vagrant บน Win10-Ubuntu แต่ต้องการให้คุณติดตั้ง Virtualbox ด้วยเหตุผลบางอย่างซึ่งฉันไม่อยากทำ

NB ฉันลองด้วยssh default -F vagrant-ssh-configวิธีการ แต่ฉันเพิ่งได้รับ

ปฏิเสธการอนุญาต (publickey, รหัสผ่าน)

ฉันคาดเดานี้เป็นเพราะIdentityFileเส้นทางเป็นเส้นทางของ Windows /mnt/c/ในขณะที่ในทุบตีก็ควรเริ่มต้นด้วย ฉันคิดว่าคุณสามารถเขียนไฟล์และแก้ไขมันถ้ามันทำงานได้ดีสำหรับคุณ


4

คุณสามารถเพิ่มการกำหนดค่าโฮสต์คนจรจัดในการกำหนดค่า SSH ท้องถิ่นของคุณ

  1. คนจรจัด ssh-config >> ~ / .ssh / config

  2. ssh vagrant @ {host}

อดีต cat ~ / .ssh / config

Host kmaster
  HostName 127.0.0.1
  User vagrant
  Port 2222..
  ....
  • ssh vagrant @ kmaster

3

มีวิธีที่จำลองวิธีที่ผู้ใช้รีโมตอาจล็อกอินเข้าสู่ระบบได้

  1. แก้ไข Vagrantfile สำหรับการเพิ่มอินสแตนซ์ของคุณ

config.vm.network "private_network", ip: "192.168.33.10"

นี่เป็นการเพิ่ม IP ส่วนตัวสำหรับโฮสต์ (ทำให้เป็นสิ่งที่คุณต้องการในช่วง 192.168 ตราบใดที่ยังไม่ได้ใช้

  1. รีสตาร์ทอินสแตนซ์ด้วยการโหลด vagrant จากบรรทัดคำสั่ง
  2. คัดลอกไฟล์ vagrant private_key ไปยัง Linux ที่เทียบเท่าคุณควรใช้งานบนกล่องของคุณ (เช่น Cygwin ถ้าบน windows, ฉันใช้ windows 10) ไปยังโฮมไดเร็กตอรี่ cygwin ของคุณ, เปลี่ยนชื่อไปตามทางไปยังสิ่งที่อธิบายโฮสต์ว่า สำหรับเช่น

your_virtual_host_name.pem

  1. คุณจะพบรหัสภายใต้. vvrant \ machines \ default \ virtualbox \ private_key

  2. ไปที่โฮมไดเร็กตอรี่ของคุณแล้วทำ Unix ssh ตามปกติ

ssh -i your_virtual_hostname.pem username@192.168.33.10

ที่ชื่อผู้ใช้อาจจะเร่ร่อนถ้าคุณมีกล่องมาตรฐานดูผลลัพธ์ของคนจรจัด ssh-config สำหรับรายละเอียดมาตรฐาน ssh สำหรับกล่อง

แค่นั้นแหละ


ขอบคุณด้วยความคิดของคุณในการคัดลอกไฟล์กุญแจจากคนจรจัดที่อื่นฉันรู้ว่าฉันมีปัญหาอะไร - ฉันใช้ตัวให้บริการlibvirtบน Linux สิ่งนี้มีความสำคัญเนื่องจากด้วยผู้ให้บริการ libvirt คุณต้องเริ่มใช้งานvagrantด้วย sudo และไฟล์ทั้งหมดใน.vagrantโฟลเดอร์จึงเป็นเจ้าของโดย root และสิทธิ์ในไฟล์คือ rw ------- ดังนั้นเฉพาะรูทเท่านั้นที่มีสิทธิ์อ่านไฟล์คีย์ บางทีนี่อาจเป็นประโยชน์กับทุกคน
TomasH

2

Vagrant จัดเก็บคีย์ส่วนตัว~/.vagrant.d/insecure_private_keyและใช้เพื่อเชื่อมต่อกับเครื่องทุกเครื่องผ่านการsshพิจารณาว่ามีการกำหนดค่าให้เชื่อมต่อกับพอร์ต 2200 (ค่าเริ่มต้น) จะเป็นสิ่งที่ต้องการ:

ssh vagrant@localhost -p 2200 -i ~/.vagrant.d/insecure_private_key

หมายเหตุ: ตรวจสอบให้แน่ใจว่าคีย์ส่วนตัวเป็นของผู้ใช้ที่ทำงานVagrantอยู่

แม้ว่าหากเป้าหมายของคุณคือการมีสภาพแวดล้อมแบบหลายเครื่องคุณสามารถใช้งานconfig.vm.defineได้

นี่คือตัวอย่างที่แสดงสภาพแวดล้อมด้วยเครื่องจักร 2 เครื่องหนึ่งเครื่องที่เรียกว่าหนึ่งwebและอีกเครื่องหนึ่งคือdatabases:

config.vm.define 'web', primary: true do |web|
        web.vm.box = 'CentOS64'
        web.vm.hostname = 'vic-develop'
        web.vm.network 'private_network', ip: '192.168.50.10', virtualbox__intnet: true
        web.vm.synced_folder '../code', '/var/www/project', :mount_options => ["dmode=777,fmode=777"]

        web.vm.provision 'ansible' do |ansible|
            ansible.playbook = 'development-web.yml'
            ansible.sudo = true
        end
end

config.vm.define 'databases' do |db|
    db.vm.box = 'CentOS64'

    db.vm.network 'private_network', ip: '192.168.50.20', virtualbox__intnet: true
    db.vm.network :forwarded_port, guest: 3306, host: 8206

    db.vm.provision 'ansible' do |ansible|
        ansible.playbook = 'development-db.yml'
        ansible.sudo = true
    end
end

แล้วคุณจะได้ทุกคนจรจัดคำสั่งต่อเครื่องที่มีอยู่คือและvagrant ssh webvagrant provision databases


ฉันสามารถเปลี่ยนการกำหนดค่าเครื่องหนึ่งเครื่องเป็นการกำหนดค่าเครื่อง 2 เครื่องได้หรือไม่หากฉันสร้างเครื่องเก่าเป็น "เครื่องหลัก"
nroose

2

ssh vagrant@<host> รหัสผ่าน: vagrant

ตัวอย่าง:

  • ssh vagrant@vagrant.local

  • หรือหลังจากตรวจสอบ IP (จากด้านในโดยใช้vagrant ssh)ssh vagrant@172.28.128.3


2

คุณสามารถเพิ่ม ssh config สำหรับโฮสต์คนจรจัดของคุณไปยัง ssh config

  1. รับ ssh config สำหรับเครื่อง vagrant ในโฟลเดอร์ vagrant: vagrant ssh-config

  2. เปิด{UserDir}/.ssh/configและผนวกผลลัพธ์จากคำสั่งก่อนหน้า หมายเหตุ : บรรทัดแรกHost defaultหมายถึงนามแฝงที่คุณจะใช้ในภายหลังสำหรับsshคำสั่ง ตั้งชื่อมันว่าเครื่องคนเร่ร่อนหรือผบ. หากคุณมี dir คนจรจัดเพียงคนเดียว - คุณสามารถตั้งชื่อได้Host vagrant

  3. Ssh ถึงคนพเนจร: ssh vagrant. นามสกุลคือนามแฝงจากขั้นตอนก่อนหน้า


1

คุณสามารถใช้ใด ๆ ของssh-configการขัดแย้งและผ่านไปยัง SSH บน commandline -o Key=valueเป็น ดังนั้นสำหรับการตั้งค่าคนจรจัดแบบโฮสต์เดียวอย่างง่าย (คุณอาจต้องทำงานเพิ่มอีกเล็กน้อยgrepหรือperlสำหรับการติดตั้งแบบหลายโฮสต์) คุณสามารถทำสิ่งต่อไปนี้ (หรือแทนที่perlด้วยsedหากคุณต้องการ):

ssh `vagrant ssh-config | tail -8 | perl -pe 's/^\s+/-o@/; s/\s/\=/;s/@/ /;s/\n/ /'` vagrant@localhost

0

Env ของฉัน คือ Win7 + Centos คำตอบที่มีข้อตกลงส่วนใหญ่ไม่ได้ผลสำหรับฉัน หลังจากล้มเหลวหลังจากพยายามssh -p [port] [usrname]@127.0.01ฉันใช้ XShell เพื่อเพิ่มเซสชันใหม่ด้วยพอร์ตคนจรจัดและชื่อผู้ใช้

มันได้ผล.

บางที Xshell อาจเป็นคนชอบใจ

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