当 Vagrant 设置虚拟机时,它会在本地机器上设置一个端口,您可以使用它通过 SSH 连接到机器。默认情况下,这通常是端口 2222,Vagrant 将其映射到虚拟机上的端口 22。所有这些本质上都是透明的,因此当您键入vagrant ssh 时,您可以毫无问题地连接到该框。Vagrant 在幕后处理所有的端口匹配和密钥查找。
出于好奇,我发现自己需要通过我在 Vagrantfile 中设置的 IP 地址直接连接到盒子,而不是使用 vagrant ssh 命令。我知道 Vagrant 使用用户名“vagrant”和在用户文件夹的 .vagrant.d 目录中找到的私钥创建了一个到服务器的链接。这是自 Vagrant 开始使用以来一直在使用的相同私钥,因此它在任何安装了 Vagrant 的机器上都是相同的。所以我的第一个测试是使用标准的 SSH 连接命令,但也使用-i标志传入 Vagrant 不安全密钥。这失败了以下输出。
$ ssh [email protected] -i /your/user/directory/.vagrant.d/insecure_private_key Received disconnect from 192.168.100.100: 2: Too many authentication failures for vagrant
经过一番挖掘,我发现虽然我传递了密钥,但我需要包含其他一些选项才能使事情正常工作。这让我发现了vagrant ssh-config命令。您可以使用此命令输出一个有效的 SSH 配置,该配置可以放入您的 SSH 配置文件中以允许连接到虚拟机。这是一些示例输出(对“默认”的引用是 Vagrantfile 中主机的名称)。
Host default HostName 127.0.0.1 User vagrant Port 2222 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile /your/user/directory/.vagrant.d/insecure_private_key IdentitiesOnly yes LogLevel FATAL ForwardAgent yes
通过将其放入您的 .ssh/config 文件,您可以通过以下方式通过 SSH 连接到虚拟机。
ssh [email protected]
然而,我们在这里所做的基本上是使用本地机器根据它的端口号将我们路由到正确的机器。我仍然想通过我为它设置的 IP 地址连接到盒子。这意味着使用-o标志将额外的 SSH 配置参数传递给命令。
因此,假设虚拟机的 IP 地址是 192.168.100.100,那么您将通过以下方式连接到它。
ssh [email protected] -i /your/user/directory/.vagrant.d/insecure_private_key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o PasswordAuthentication=no -o IdentitiesOnly=yes
您可以通过使用 SSH 配置文件在运行时自动将这些参数添加到您的 SSH 调用中来稍微简化此操作。这假设 box IP 地址与上面相同,但您也可以在 Host 标头中包含通配符以包含许多 Vagrant box(基于它们的 IP 地址)。
Host 192.168.100.100 StrictHostKeyChecking no UserKnownHostsFile /dev/null IdentitiesOnly yes User vagrant IdentityFile /your/user/directory/.vagrant.d/insecure_private_key PasswordAuthentication no
这允许您使用以下命令连接到盒子(没有这么多额外的选项)。
ssh [email protected]