Bagaimana cara ssh ke gelandangan tanpa benar-benar menjalankan "gelandangan ssh"?

149

Saya ingin mereproduksi cara bagaimana Vagrant log ke VM saya dalam skrip shell menggunakan sshperintah, jadi saya membuat alias ke instance Vagrant saya.

Apa sintaks perintah untuk menggunakan sshperintah biasa untuk mengaksesnya?

Kevin Burke
sumber
Apa yang sebenarnya Anda tanyakan, saya melihat tiga hal berbeda ditanyakan, mungkin Anda dapat memperluas pertanyaan lalu menandai untuk dimigrasi. Terima kasih.
Kev
3
Secara default port ssh dari VM yang -22 akan diteruskan ke 2222 pada mesin host. Saya putty-ed pada 127.0.0.1 dan port 2222 dengan SSH dan berhasil!
Vishal Biyani
8
Jika Anda menjalankan lebih dari satu kotak, nomor port itu akan berubah secara otomatis. Anda bisa mendapatkan yang benar dengan berlari vagrant ssh-config.
Stefano Palazzo

Jawaban:

108

Saya harus menerapkan kembali "vagrant ssh" karena -copsi itu tidak meneruskan argumen dengan benar. Ini pada dasarnya apa yang dilakukannya (mungkin ada lebih banyak, tetapi berfungsi dengan baik dengan cara ini)

#!/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 \
    "$@"

Sebagai satu-liner (dengan terima kasih kepada kgadek):

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

Untuk memperhitungkan ketika Anda memiliki lebih dari satu host gelandangan, ini akan memilih host yang diinginkan, serta menyisihkan baris kosong dari konfigurasi (menggunakan sed):

HOST=name-of-my-host
ssh $(vagrant ssh-config $HOST | sed '/^[[:space:]]*$/d' |  awk 'NR>1 {print " -o "$1"="$2}') localhost
Stefano Palazzo
sumber
3
Jawaban ini tidak memungkinkan Anda sshuntuk Vagrant Anda dari luar Vagrantfiledirektori ("menggunakan sshperintah biasa "), yang merupakan cara saya menafsirkan pertanyaan itu.
sjy
Anda dapat mengatur porta sendiri. Dengan demikian skrip akan dapat dieksekusi dari direktori mana pun.
Yser
Jadi, apa yang membuat port itu cara untuk masuk ke mesin? Di mana konfigurasi port apa itu?
nroose
1
Vagrant memilih yang tidak digunakan dengan auto_correct: truepengaturan. Berikut ini info lebih lanjut tentang cara mengubahnya secara manual
Stefano Palazzo
1
Saya harus melewati baris pertama, yaitu. yang Hostmasuk. Perintah yang dimodifikasi adalah:ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
kgadek
148

Sudah ada banyak jawaban, tetapi semuanya tampaknya terlalu rumit atau menyelesaikan masalah yang tidak dimiliki penanya.

secara sederhana:

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

# run ssh with the file.
ssh -F vagrant-ssh default
Steven Soroka
sumber
2
Itu mengagumkan. Pikiran menambahkan vagrant-sshfile .gitignore.
sashaegorov
5
Dengan beberapa cangkang (mis. zsh), One-liner berikut berfungsi:ssh -F =(vagrant ssh-config) default
liori
4
Anda mungkin ingin mengulang hasil ini ke sshfile konfigurasi Anda :, vagrant ssh-config >> ~/.ssh/configjadi Anda jalankan ssh defaultdari mana saja di sistem Anda, di mana defaultnama VM yang dapat Anda tentukan seperti di sini
adamczi
Terima kasih @adamczi ini adalah cara sederhana yang juga berfungsi untuk solusi otomatis di mana menambahkan parameter ssh tambahan -Ftidak mudah
laimison
3
Dengan menambahkan entri ke ~/.ssh/configdalam cara @adamczi menyarankan Anda kemudian dapat menggunakan ekstensi Visual Studio Code Remote - SSH untuk ssh ke Vagrant VM dan mengedit file dan melakukan pengembangan jarak jauh. Cukup CMD-SHIFT-P lalu "Remote-SSH: Sambungkan ke Host ..." dan entri ssh .config yang baru saja Anda tambahkan secara otomatis terdaftar - Anda cukup pilih dan voila, vscode terhubung ke vm gelandangan jarak jauh Anda! Tanpa pendekatan entri konfigurasi, saya tidak yakin bagaimana lagi saya akan melakukannya dengan vscode.
abulka
52

Dalam menjalankan terminal

vagrant ssh

Di terminal lain jendela / tab dijalankan

ps aux | grep ssh

Di sana Anda akan melihat perintah aktual dieksekusi oleh Vagrant, sesuatu seperti ini:

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
Leksat
sumber
Trik hebat jika Anda memerlukan host dari gelandangan Anda untuk ssh karena alasan lain, seperti koneksi SQL GUI, seperti Sequel Pro. Yang ini selamatkan aku!
Atomox
19

Cukup kirimkan keseluruhan vagrant ssh-configsebagai file konfigurasi sshdengan -F configfileparameter. Host alias untuk menyambungkan didefinisikan pada baris pertama di vagrant ssh-config; Host defaultberarti Anda dapat terhubung dengan ssh default.

Saya tidak bisa melihat opsi untuk membaca file konfigurasi dari input standar, jadi lanjutkan dengan rute file temp. Berikut ini adalah satu-liner yang juga membersihkan $TMPDIR.vagrant-ssh-configfile sementara sesudahnya. Itu perlu dijalankan di direktori yang sama dengan Anda Vagrantfile, dengan asumsi Anda kotak gelrant sudah berjalan dan berjalan.

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

Catatan: pada sistem Mac OSX saya, $TMPDIRperluas /var/folders/46/yltlhtgx8m5cg68_w95wgvy41324gn/T/(sekarang). Gunakan variabel lain , atau folder lain, jika tidak disetel pada sistem Anda.

Joel Purra
sumber
3
Jika Anda menggunakan bash atau zsh, subtitusi proses adalah cara yang lebih sederhana untuk meneruskan output dari satu perintah ke perintah lainnya. bash: ssh -F <(vagrant ssh-config) zsh: substitusi proses zsh ssh -F =(vagrant ssh-config)
myeeshen
@myshen: menurut jawaban oleh proses substitusi @tyrion tidak bekerja ssh -Fdi bash - cara Anda menyebutkan harus bekerja di zsh sekalipun.
Joel Purra
Dang, aku benar-benar perlu belajar bagaimana cara menggunakan gelandangan, belum lagi bash.
Spencer Williams
14

Saya memecahkan ini dengan cara yang sangat sederhana: ketika Anda memulai kotak gelandangan itu menunjukkan alamat ssh seperti ini

SSH address: 127.0.0.1:2222

maka Anda dapat terhubung ke kotak dengan menggunakan pengguna gelandangan, tuan rumah dan port yang Anda dapatkan

ssh vagrant@127.0.0.1 -p 2222
Samer Abu Gahgah
sumber
1
bagus! dan perhatikan bahwa biasanya, kata sandi untuk pengguna gelandangan adalahvagrant
Brad Parks
7

Jika Anda tidak perlu menggunakan stdin dengan ssh(misalnya Anda ingin menjalankan hanya perintah dan keluar) Anda bisa menggunakan:

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

Metode ini disarankan sebagai jawaban atas pertanyaan serupa di grup google .

Sayangnya substitusi proses bash juga tidak berfungsi (lihat pertanyaan ini di unix.stackexchange untuk detail lebih lanjut).

Opsi terbaik yang Anda miliki, jika Anda ingin shell interaktif, adalah membuat file temp dan menggunakannya dengan ssh -Fatau menggunakan awkseperti yang disarankan oleh jawaban lain.

tyrion
sumber
5

Jika Anda hanya ingin mengaturnya sehingga Anda dapat menggunakan normal ssh commandline normal, serta scp dan semacamnya, Anda dapat menjalankan vagrant ssh-configdan menambahkan output ke konfigurasi ssh default Anda. Jika Anda mengganti baris "Host default" dengan nama host yang lebih deskriptif, Anda sebaiknya melanjutkan.

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box
Tedward
sumber
Persis seperti yang diperintahkan dokter ... Thx.
xenoid
4

Jika Anda hanya ingin perintah minimum telanjang untuk terhubung ke kotak Anda, Anda perlu tahu port yang digunakannya (dicetak saat melakukan vagrant up, atau terlihat melakukan vagrant ssh-config) dan di mana kunci SSH pribadi Anda (juga terlihat saat melakukan vagrant ssh-config)

Maka itu hanya masalah menyediakan kunci dan port:

ssh -p 2222 -i $HOME/vagrantenv/.vagrant/machines/default/virtualbox/private_key [email protected]

Nico Villanueva
sumber
4

Banyak jawaban lain menganggap Anda telah menginstal Vagrant.

Saya telah menginstal Vagrant pada Windows 10, tetapi saya tidak bisa vagrant sshkarena saya menggunakan Putty sebagai klien SSH saya, yang tidak akan diterima oleh gelandangan.

The sshberhasil ditemukan dieksekusi dalam PATH adalah klien Putty link SSH. Vagrant hanya kompatibel dengan klien OpenSSH SSH.

Namun, di Windows 10 kami juga memiliki Bash di Ubuntu di Windows. Jadi, saya hanya menggunakannya dengan perintah berikut:

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

Cukup mudah untuk menginstal Vagrant di Win10-Ubuntu tetapi juga ingin Anda menginstal Virtualbox karena beberapa alasan, yang saya lebih suka tidak lakukan.

NB Saya sudah mencoba dengan ssh default -F vagrant-ssh-configmetode ini, tetapi saya baru saja mendapatkannya

Izin ditolak (publickey, kata sandi).

Saya menduga ini karena IdentityFilepath adalah path Windows, sedangkan di Bash, harus dimulai dengan /mnt/c/. Saya kira Anda hanya bisa menulis file dan memodifikasinya jika itu bekerja lebih baik untuk Anda.

Mpen
sumber
4

Anda dapat menambahkan konfigurasi host gelandangan ke konfigurasi ssh lokal Anda.

  1. gelandangan ssh-config >> ~ / .ssh / config

  2. ssh vagrant @ {host}

ex. cat ~ / .ssh / config

Host kmaster
  HostName 127.0.0.1
  User vagrant
  Port 2222..
  ....
  • ssh vagrant @ kmaster
Vinay Kumar Gupta
sumber
3

Ada cara yang mereplikasi bagaimana pengguna jarak jauh mungkin masuk ke sistem

  1. Edit Vagrantfile untuk contoh Anda menambahkan

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

Ini menambahkan IP pribadi untuk host (jadikan itu yang Anda inginkan dalam kisaran 192.168 selama belum digunakan

  1. Mulai ulang instance dengan vagrant reload dari baris perintah
  2. Salin file private_key gelandangan ke beberapa Linux yang sepadan dengan yang seharusnya Anda jalankan di komputer Anda (mis. Cygwin jika di windows, saya menggunakan windows 10) ke direktori home cygwin Anda, menamai ulangnya sepanjang jalan dengan sesuatu yang menggambarkan host kuncinya adalah untuk digunakan untuk, mis

your_virtual_host_name.pem

  1. Anda akan menemukan kunci di bawah .vagrant \ machines \ default \ virtualbox \ private_key

  2. Buka direktori home Anda dan lakukan Unix ssh biasa, jadi

ssh -i your_virtual_hostname.pem [email protected]

di mana nama pengguna, mungkin menjadi gelandangan jika Anda memiliki kotak standar, lihat output dari gelran ssh-config untuk detail standar ssh untuk kotak tersebut.

Itu dia

Jimbo
sumber
Terima kasih, terima kasih atas ide Anda menyalin file kunci dari gelandangan di tempat lain. Saya menyadari masalah apa yang saya miliki - saya menggunakan penyedia libvirt di Linux. Ini penting karena dengan penyedia libvirt Anda perlu menginisialisasi gelandangan dengan sudo dan karena itu semua file dalam .vagrantfolder dimiliki oleh root. Dan izin pada file adalah rw ------- jadi hanya root yang memiliki izin untuk membaca file kunci. Mungkin ini bisa membantu siapa saja.
TomasH
2

Vagrant menyimpan kunci pribadi ~/.vagrant.d/insecure_private_keydan menggunakannya untuk terhubung ke setiap mesin melalui ssh, mengingat bahwa itu dikonfigurasi untuk terhubung pada port 2200 (default) itu akan menjadi seperti:

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

Catatan: pastikan bahwa kunci pribadi dimiliki oleh pengguna yang menjalankan Vagrant .

Meskipun jika tujuan Anda adalah memiliki lingkungan multi-mesin, Anda dapat menggunakannyaconfig.vm.define .

Berikut ini contoh yang menggambarkan lingkungan dengan 2 mesin, satu disebut webdan yang lainnya adalah 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

Maka Anda akan memiliki semua perintah Vagrant yang tersedia per mesin, yaitu vagrant ssh webdan vagrant provision databases.

Mulkave
sumber
Bisakah saya mengubah konfigurasi satu mesin menjadi konfigurasi 2 mesin, jika saya membuat mesin lama "primer"?
nroose
2

Anda dapat menambahkan ssh config untuk host gelandangan Anda ke ssh config.

  1. Dapatkan ssh config untuk mesin gelandangan di folder gelandangan: vagrant ssh-config

  2. Buka {UserDir}/.ssh/configdan tambahkan di sana hasil dari perintah sebelumnya. Catatan : baris pertama Host defaultberarti alias yang akan Anda gunakan nanti untuk sshperintah. Beri nama itu sebagai mesin atau gelandangan Anda. Jika Anda hanya memiliki satu dir gelandangan - Anda dapat menyebutkannyaHost vagrant

  3. Ssh untuk gelandangan: ssh vagrant. Nama belakang adalah alias dari langkah sebelumnya.

FreeLightman
sumber
1

Anda dapat mengambil ssh-configargumen apa pun , dan meneruskannya ke ssh pada baris perintah sebagai -o Key=value. Jadi, untuk pengaturan gelran satu-host sederhana (Anda mungkin harus melakukan lebih banyak pekerjaan dengan grepatau perluntuk pengaturan multihost), Anda dapat melakukan sesuatu seperti berikut (atau ganti perldengan sedjika Anda mau):

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

Env saya. adalah Win7 + Centos. Jawaban dengan persetujuan paling tidak berhasil untuk saya. Setelah gagal setelah mencoba ssh -p [port] [usrname]@127.0.01, saya hanya menggunakan XShell untuk menambahkan sesi baru dengan port gelandangan dan nama pengguna.

Berhasil.

Mungkin Xshell adalah calon.

onebraveman
sumber