Как сделать ssh vagrant без запуска «vagrant ssh»?

149

Я хотел бы воспроизвести способ входа Vagrant на мою виртуальную машину в сценарии оболочки с помощью sshкоманды, поэтому я создаю псевдоним для своего экземпляра Vagrant.

Каков синтаксис команды, чтобы использовать обычную sshкоманду для доступа к ней?

Кевин Берк
источник
Что вы на самом деле спрашиваете, я вижу три разные вопросы, может быть, вы могли бы расширить вопрос, а затем пометить, чтобы перенести. Спасибо.
Кев
3
По умолчанию порт ssh виртуальной машины (-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
Вагрант выбирает неиспользованный с auto_correct: trueнастройкой. Вот больше информации о том, как изменить это вручную
Стефано Палаццо
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.
сашаегоров
5
С некоторыми оболочками (например zsh) работают следующие однострочные:ssh -F =(vagrant ssh-config) default
liori
4
Возможно, вы захотите отобразить этот результат в своем sshконфигурационном файле:, vagrant ssh-config >> ~/.ssh/configтак что вы просто запускаете ssh defaultиз любой точки вашей системы, где defaultнаходится имя виртуальной машины, которое вы можете указать, например, здесь
adamczi
Благодаря @adamczi это упрощенный способ , который также работает для автоматизированных решений , в которых добавление дополнительного параметра SSH -Fне просто
laimison
3
Добавив запись ~/.ssh/configв способ, который @adamczi предлагает, вы можете использовать расширение Visual Studio Code Remote - SSH для ssh в Vagrant VM, редактировать файлы и выполнять удаленную разработку. Просто CMD-SHIFT-P, затем «Remote-SSH: подключиться к хосту ...» и добавленная вами запись ssh .config автоматически появится в списке - вы просто выбираете ее и вуаля, vscode подключается к вашему удаленному vagrant vm! Без подхода ввода конфигурации я не уверен, как иначе я сделал бы это с vscode.
Абулька
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
Leksat
источник
Отличный трюк, если вам нужен хост вашего vagrant для ssh по другим причинам, таким как соединение с графическим интерфейсом SQL, например, Sequel Pro. Этот спасти меня!
Atomox
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: в соответствии с ответом @tyrionssh -F в bash не работает подстановка процессов - способ, который вы упомянули, должен работать в zsh.
Джоэл Пурра
Черт, мне действительно нужно научиться использовать бродяги, не говоря уже о bash.
Спенсер Уильямс
14

Я решил это очень просто: когда вы запускаете окно vagrant, оно показывает адрес ssh, как это

SSH address: 127.0.0.1:2222

затем вы можете подключиться к коробке, используя пользователя vagrant, хост и порт, который вы получите

ssh vagrant@127.0.0.1 -p 2222
Самер Абу Гага
источник
1
отлично! и обратите внимание, что, как правило, пароль для бродячего пользователяvagrant
Брэд Паркс
7

Если вам не нужно использовать stdin с ssh(например, вы хотите выполнить только команду и выйти из системы), вы можете использовать:

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

Этот метод был предложен в ответ на аналогичный вопрос в группах Google .

К сожалению, подстановка процесса bash также не работает (см. Этот вопрос в unix.stackexchange для более подробной информации).

Лучшие варианты у вас есть, если вы хотите интерактивную оболочку, должны создать временный файл и использовать его с ssh -Fили использовать awkкак предложено другие ответы.

Тирион
источник
5

Если вы просто хотите настроить его так, чтобы вы могли нормально использовать обычную командную строку ssh, а также scp и т. Д., Вы можете запустить vagrant ssh-configи добавить вывод в вашу конфигурацию ssh по умолчанию. Если вы замените строку «Host default» на более информативное имя хоста, вам следует начать.

vagrant ssh-config |sed -e "s/Host default/Host my_cool_dev_box/" >> ~/.ssh/config
ssh my_cool_dev_box
Tedward
источник
Именно то, что доктор прописал ... Спасибо.
ксеноид
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-клиента, который vagrant не примет.

sshИсполняемый Найденный в PATH является клиент PuTTY Link SSH. Vagrant совместим только с клиентами SSSS OpenSSH.

Тем не менее, в 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методом, но я просто получаю

В доступе отказано (публичный ключ, пароль).

Я предполагаю, что это потому, что IdentityFileпуть - это путь Windows, тогда как в Bash он должен начинаться с /mnt/c/. Я полагаю, вы могли бы просто записать файл, а затем изменить его, если это будет работать лучше для вас.

mpen
источник
4

Вы можете добавить конфигурацию vagrant host в вашу локальную конфигурацию 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. Перезапустите экземпляр с помощью vagrant reload из командной строки.
  2. Скопируйте файл vagrant 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 ​​для коробки.

это оно

Джимбо
источник
Спасибо, благодаря вашей идее скопировать файл ключа из vagrant в другом месте, я понял, какая у меня проблема - я использовал провайдер libvirt в Linux. Это важно, потому что с поставщиком libvirt вам нужно инициализировать vagrant с помощью 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.

Mulkave
источник
Могу ли я изменить конфигурацию с одной машиной на конфигурацию с двумя машинами, если я сделаю старую машину "основной"?
nroose
2

ssh vagrant@<host> пароль: vagrant

Примеры:

  • ssh vagrant@vagrant.local

  • или после проверки IP (изнутри, используя vagrant ssh)ssh vagrant@172.28.128.3

Yercalamarino
источник
2

Вы можете добавить конфигурацию ssh для вашего бродячего хоста в конфигурацию ssh.

  1. Получить конфигурацию ssh для vagrant-машины в папке vagrant: vagrant ssh-config

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

  3. Сш к бродяге ssh vagrant. Фамилия является псевдонимом из предыдущего шага.

FreeLightman
источник
1

Вы можете взять любой из ssh-configаргументов и передать их в ssh в командной строке как -o Key=value. Таким образом, для простой установки vagrant с одним хостом (вам, возможно, придется проделать немного больше работы с установкой с несколькими хостами 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 - кандидат.

onebraveman
источник