Як ssh для бродяг, фактично не виконуючи "vagrant ssh"?


149

Я хотів би відтворити спосіб, коли Vagrant здійснює реєстрацію до моєї VM в скрипті оболонки за допомогою sshкоманди, тому я створю псевдонім моєму екземпляру Vagrant.

Який синтаксис команд використовувати звичайну sshкоманду для доступу до неї?


Що ви насправді запитуєте? Я бачу три різні запитання, можливо, ви можете розширити питання, а потім прапор мігрувати. Дякую.
Кев

3
За замовчуванням ssh-порт VM, який становить -22, буде переданий на 2222 на хост-машині. Я шпатлів-ед на 127.0.0.1 і порт 2222 з SSH, і він працював!
Вішал Біяні

8
Якщо ви працюєте з декількома полями, цей номер порта автоматично зміниться. Ви можете отримати правильний, запустивши vagrant ssh-config.
Стефано Палацо

Відповіді:


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
Vagrant вибирає невикористаний з auto_correct: trueналаштуванням. Ось додаткові відомості про те, як це змінити вручну
Стефано Палаццо

1
Мені довелося пропустити перший рядок, тобто. Hostзапис. ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
Зміненою

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.
сашаегоров

5
З деякими снарядами (напр. zsh) Працює наступний ssh -F =(vagrant ssh-config) default
однопластовий

4
Ви можете захотіти повторити цей результат у своєму sshконфігураційному файлі: vagrant ssh-config >> ~/.ssh/configтож просто запустіть ssh defaultз будь-якої точки вашої системи, звідки defaultназва VM, яку ви можете вказати, як тут
adamczi

Дякую @adamczi - це спрощений спосіб, який також працює для автоматизованих рішень, де додавання додаткового параметра ssh -Fне є простим
laimison

3
Додаючи запис до ~/.ssh/configспособу, який @adamczi пропонує, ви можете потім скористатися розширенням Visual Studio Code - SSH, щоб ssh у VM Vagrant та редагувати файли та робити віддалену розробку. Просто CMD-SHIFT-P, потім "Віддалений SSH: Підключення до хоста ...", і щойно доданий вами запис ssh .config автоматично перераховується - ви просто вибираєте його і вуаля, vscode підключається до вашого віддаленого бродячого vm! Без підходу введення конфігурації я не впевнений, як інакше я це зробив би з vscode.
abulka

52

У термінальному режимі

vagrant ssh

В іншому вікні / вкладці терміналу запустіть

ps aux | grep ssh

Там ви побачите фактичну команду, виконану Вагрантом, приблизно так:

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. Цей врятуй мене!
Атомокс

19

Просто пройти весь vagrant ssh-configяк конфігураційний файл , sshз -F configfileпараметром. Псевдонім хоста, до якого потрібно підключитися, визначений у першому рядку в vagrant ssh-config; Host defaultозначає, що можна зв’язатися ssh default.

Я не бачив можливості прочитати конфігураційний файл зі стандартного вводу, тому пішов з тимчасовим файлом. Ось однокласник, який також очищає тимчасовий $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в bash - так, як ви згадуєте, має працювати в zsh, хоча.
Джоел Пурра

Данг, мені дуже потрібно навчитися насправді використовувати бродягу, не кажучи вже про баш.
Спенсер Вільямс

14

Я вирішив це дуже простим способом: коли ви запускаєте поле бродячого, він показує ssh адресу, як це

SSH address: 127.0.0.1:2222

тоді ви можете підключитися до вікна, використовуючи бродячого користувача, хоста та отриманий порт

ssh vagrant@127.0.0.1 -p 2222

1
приємно! і зауважте, що як правило, пароль для бродячого користувачаvagrant
Бред Паркс

7

Якщо вам не потрібно використовувати stdin з ssh(наприклад, ви хочете виконати лише команду та вихід із системи), ви можете використовувати:

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

Цей метод був запропонований у відповідь на аналогічне запитання щодо гугл-груп .

На жаль, заміна процесів bash також не працює (див. Це питання на 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

Саме те, що наказав лікар ... Thx.
ксеноїд

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Виконуваний Знайдений в PATH є клієнт PuTTY Link 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, тоді як у Bash він повинен починатися /mnt/c/. Я припускаю, що ви можете просто записати файл, а потім змінити його, якщо це працює для вас краще.


4

Ви можете додати нескінченну конфігурацію хоста до локальної конфігурації ssh.

  1. vagrant 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. Перезапустіть екземпляр з бродячим перезавантаженням з командного рядка
  2. Скопіюйте блукаючий файл private_key в якийсь еквівалент Linux, який ви повинні мати у своєму вікні (наприклад, Cygwin, якщо у Windows, я використовую windows 10) у свій домашній каталог cygwin, перейменувавши його по дорозі на те, що описує хост, який слід використовувати ключ. для, напр

your_virtual_host_name.pem

  1. Ви знайдете ключ під .vagrant \ machines \ default \ virtualbox \ private_key

  2. Перейдіть у свій домашній каталог і зробіть свій звичайний Unix ssh, так

ssh -i your_virtual_hostname.pem username@192.168.33.10

де ім'я користувача може бути бродливим, якщо у вас є стандартне поле, подивіться на висновок vagrant ssh-config для стандартних деталей ssh ​​для цього поля.

Це воно


Дякую, завдяки вашій ідеї скопіювати ключовий файл із бродячого в іншому місці, я зрозумів, у чому проблема - я скористався провайдером libvirt в Linux. Це важливо, тому що для постачальника послуг libvirt вам потрібно ініціалізувати бродягу з sudo, тому всі файли в .vagrantпапці є власниками root. І дозволи на файл були rw -------, тому тільки root мав дозволи на читання файлу ключів. Можливо, це може бути корисним для когось.
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.

Ось приклад, що ілюструє середовище з двома машинами, одна називається, 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 для кожної машини, тобто vagrant ssh webі vagrant 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 ssh-config

  2. Відкрити {UserDir}/.ssh/configта додати туди результат попередньої команди. Примітка : перший рядок Host defaultозначає псевдонім, який ви будете використовувати пізніше для sshкоманди. Назвіть це як вашу бродячу машину чи реж. Якщо у вас є лише один бродячий реж - ви можете назвати йогоHost vagrant

  3. Ssh до бродячої: ssh vagrant. Прізвище - псевдонім попереднього кроку.


1

Ви можете взяти будь-який з ssh-configаргументів і передати їх в ssh на командному рядку як -o Key=value. Таким чином, для простого один-хоста бродячих установок (ви , можливо , прийдеш зробити трохи більше роботи з grepабо perlдля multihost настройки), ви можете зробити що - щось подібне до наступного (або замінити perlз , sedякщо ви хочете):

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

0

My Env. є Win7 + Centos. Відповідь з більшістю згоди не працює для мене. Після відмови після спробиssh -p [port] [usrname]@127.0.01 я просто використовую XShell, щоб додати новий сеанс із портом бродячого та іменем користувача.

Це працює.

Можливо, Xshell - це кандинат.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.