如何在不实际运行“ vagrant ssh”的情况下ssh变成无业游民?


149

我想重现Vagrant使用ssh命令在Shell脚本中登录到我的VM的方式,因此我为Vagrant实例创建了一个别名。

使用常规ssh命令访问它的命令语法是什么?


您实际上要问的是什么,我看到了三个不同的问题,也许您可​​以扩展问题,然后标记要迁移。谢谢。
凯夫(Kev)2012年

3
默认情况下,VM的ssh端口-22将被转发到主机上的2222。我用SSH在127.0.0.1和端口2222上使用了腻子,它起作用了!
Vishal Biyani 2012年

8
如果您运行的是多个设备,则该端口号将自动更改。您可以通过运行来获得正确的选择vagrant ssh-config
Stefano Palazzo 2012年

Answers:


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
这个答案不会让您sshVagrantfile目录外部访问“ Vagrant ”(“使用常规ssh命令”),这就是我对问题的解释方式。
sjy 2014年

您可以自行设置端口。因此,该脚本可从任何目录执行。
伊瑟2014年

那么,使该端口成为进入计算机的方式的原因是什么?该端口的配置在哪里?
nroose

1
Vagrant通过auto_correct: true设置选择一个未使用的。这是有关如何手动更改
Stefano Palazzo 2015年

1
我不得不跳过第一行。该Host条目。修改后的命令为:ssh $(vagrant ssh-config | awk 'NR>1 {print " -o "$1"="$2}') localhost
kgadek

147

已经有很多答案,但是它们似乎都过于复杂,或者解决了问询者所没有的问题。

只是:

# 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 '17

5
对于某些外壳(例如zsh),以下一线工作:ssh -F =(vagrant ssh-config) default
liori

4
您可能希望将此结果回显到ssh配置文件中: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然后“远程SSH:连接到主机...”,您刚刚添加的ssh .config条目就会自动列出-您只需选择它,瞧,vscode即可连接到您的远程无所不在的vm!如果没有config entry方法,我不确定使用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

如果由于其他原因(例如Sequel Pro)而需要SSH来作为SSH的宿主,这是个绝妙的选择。这救了我!
Atomox

19

就在整个传递vagrant ssh-config一个配置文件,以ssh-F configfile参数。连接到的主机别名在的第一行中定义vagrant ssh-configHost default表示您可以与进行连接ssh default

我看不到从标准输入中读取配置文件的选项,因此使用了临时文件路由。这是一个单行代码,该$TMPDIR.vagrant-ssh-config文件还可以在以后清除临时文件。Vagrantfile假设您的vagrant box已启动并正在运行,则需要在与您的目录相同的目录中执行该命令。

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 2014年

@myshen:根据@tyrion 的回答,bash不能替代进程ssh -F-尽管您提到的方式应该在zsh中起作用。
乔尔·普拉

当,我真的需要学习如何真正使用无业游民,更不用说bash了。
斯宾塞·威廉姆斯

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网上论坛的类似问题建议使用此方法。

不幸的是,bash进程替换也不起作用(有关更多详细信息,请参见unix.stackexchange上的此问题)。

如果要使用交互式shell,最好的选择是创建一个临时文件,并与其他答案一起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

完全是医生命令的...
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。

我在Windows 10上安装了Vagrant,但是不能,vagrant ssh因为我使用PuTTy作为我的SSH客户端,而vagrant不会接受。

ssh在PATH中找到的可执行文件是PuTTY Link SSH客户端。Vagrant仅与OpenSSH SSH客户端兼容。

但是,在Windows 10中,我们在Windows的Ubuntu上也有Bash。因此,我将其与以下命令配合使用:

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

在Win10-Ubuntu上安装Vagrant很容易,但是出于某些原因,它也希望您安装Virtualbox,而我不想这样做。

注意我已经尝试过该ssh default -F vagrant-ssh-config方法,但是我得到了

权限被拒绝(公钥,密码)。

我猜这是因为该IdentityFile路径是Windows路径,而在Bash中,它应该以开头/mnt/c/。我想您可以写出文件,然后修改它(如果对您更好)。


4

您可以将无业游民的主机配置添加到本地ssh配置中。

  1. 流浪者ssh-config >>〜/ .ssh / config

  2. ssh vagrant @ {host}

例如 猫〜/ .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等效文件(例如,如果在Windows上为Cygwin,我使用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

如果您有标准框,则用户名很可能是无业游民的,请查看无业游民ssh-config的输出,以获取该框的ssh标准详细信息。

而已


谢谢您,感谢您从其他地方的流浪者复制密钥文件的想法,我意识到自己遇到了什么问题-我在Linux上使用了libvirt提供程序。这很重要,因为使用libvirt provider时,您需要使用sudo 初始化vagrant.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 webvagrant provision databases


如果我将旧计算机设为“主要”,是否可以将一台计算机的配置更改为两台计算机的配置?
nroose

2

ssh vagrant@<host> 密码: vagrant

例子:

  • ssh vagrant@vagrant.local

  • 或在检查IP之后(从内部使用vagrant sshssh vagrant@172.28.128.3


2

您可以将流浪主机的ssh config添加到ssh config。

  1. 在流浪者文件夹中获取流浪者机器的ssh配置: 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主机设置进行更多的工作),您可以执行以下操作(或根据需要替换perlsed):

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

0

我的环境 是Win7 + Centos。多数同意的答案对我不起作用。尝试失败后ssh -p [port] [usrname]@127.0.01,我仅使用XShell添加带有无用的端口和用户名的新会话。

有用。

也许Xshell是一个候选人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.