如何找到流浪IP?

Posted

技术标签:

【中文标题】如何找到流浪IP?【英文标题】:How to find the Vagrant IP? 【发布时间】:2013-01-30 00:33:18 【问题描述】:

我一直在使用 Capistrano 开发自动化部署,并使用 Vagrant 作为我的测试虚拟服务器。

问题是,我需要 Vagrant 的 IP 来“ssh”。

我尝试了ifconfig 并获得了 IP,但看起来它不是确切的流浪 IP。

有人可以帮我获取 Vagrant IP 吗?

【问题讨论】:

只是提醒任何阅读此内容的人... ssh 进入 vagrant 盒子的方法是位于 Vagrantfile 所在的文件夹中,然后输入 vagrant ssh。不需要 IP 地址。但是,出于编写脚本或创建 /etc/hosts 条目的目的,此处的答案很有用,尤其是 this one。 如果是 windows 框,得到答案也会很有趣 你当时想达到什么目标?你愿意回答这个问题吗? 你也可以使用 "vagrant global-status" 获取正在运行的 Vagrant box 的 ID 然后执行: "vagrant ssh " 【参考方案1】:

我遇到了这样的事情,所以我在 Vagrant 框中添加了运行 bash 脚本,并在主机文件夹中获取公共 IP 地址文件的输出。

在 Vagrantfile 中添加这个

...
  config.vm.provision "shell", path: "public-ip.sh"
  config.vm.synced_folder '.', '/vagrant'
...

在同一个 Vagrantfile 文件夹中创建 bash 脚本名称 public-ip.sh


#!/bin/bash 

# change eth1 to your desired network interface, in my vagrantfile i have first NAT and second is bridge dhcp network and i want to know random dhcp IP.

box_ip=$(ip address show eth1 | grep 'inet ' | sed -e 's/^.*inet //' -e 's/\/.*$//')" 

echo "$box_ip" | tee public_ip.txt

echo "add box ip to your host machine /etc/hosts entry so you can connect the box using box hostname"


当您执行 vagrant up 时,您将看到该框的公有 ip 或私有 ip 的 vagrant 输出,您可以在任何时候将其添加到主机条目中

【讨论】:

【参考方案2】:

打开一个终端,cd 到你的 Vagrantfile 的路径并写下这个

(Linux)

vagrant ssh -c "hostname -I | cut -d' ' -f2" 2>/dev/null

(OS X)

vagrant ssh -c "hostname -I | cut -d' ' -f2" 2>/dev/null | pbcopy

适用于 Linux 的命令也适用于 Windows。没办法测试,抱歉。

来源:https://coderwall.com/p/etzdmq/get-vagrant-box-guest-ip-from-host

【讨论】:

这应该是公认的答案。它很简单,可编写脚本,并返回 vagrant box 使用的实际 IP 地址。【参考方案3】:

我们使用 VirtualBox 作为提供者,对于虚拟盒子,您可以使用VBoxManage 获取 IP 地址

VBoxManage guestproperty get <virtual-box-machine-name> /VirtualBox/GuestInfo/Net/1/V4/IP

【讨论】:

非常感谢! 如果未设置,请尝试enumerate 获取所有访客属性:VBoxManage guestproperty enumerate &lt;virtual-box-machine-name&gt;【参考方案4】:

因为我还没有在这里看到它...当你vagrant ssh进入盒子时,我意识到它实际上告诉你接口的IP地址。你可以在那里得到它。例如。

 ~/Documents/jupyterhub-ansible (features *%)$  vagrant ssh
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-50-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed May 22 12:00:34 UTC 2019

  System load:  0.12              Processes:             101
  Usage of /:   56.5% of 9.63GB   Users logged in:       0
  Memory usage: 19%               IP address for enp0s3: 10.0.2.15
  Swap usage:   0%                IP address for enp0s8: 192.168.33.10


10 packages can be updated.
1 update is a security update.


Last login: Wed May 22 12:00:04 2019 from 192.168.33.1
vagrant@ubuntu-bionic:~$ 

在我的流浪文件中,我分配了这样的地址:

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

如您所见, IP address for enp0s8: 192.168.33.10

【讨论】:

【参考方案5】:

终止使用vagrant ssh 打开的连接将显示地址,因此可以执行虚拟或空命令:

$ vagrant ssh -c ''
Connection to 192.168.121.155 closed.

【讨论】:

这只是为我返回 127.0.0.1。【参考方案6】:

运行:

vagrant ssh-config > .ssh.config

然后在config/deploy.rb

role :web, "default"     
role :app, "default"
set :use_sudo, true
set :user, 'root'
set :run_method, :sudo

# Must be set for the password prompt from git to work
default_run_options[:pty] = true
ssh_options[:forward_agent] = true
ssh_options[:config] = '.ssh.config'

【讨论】:

不幸的是,vagrant ssh-config 没有显示虚拟机的真实 SSH 配置。使用该 IP/端口只会得到错误“名称或服务未知” 为什么这个答案在明显错误的情况下被接受?该命令所做的只是向您显示主机上用于 ssh 进入 vagrant 框的配置。如果您在 Vagrantfile 中使用 private_network 设置,并且想要找到您的 VM 的 IP,以便您可以向它发出 HTTP 请求或其他任何东西,那么如下所述,目前看来唯一的方法是 SSH 进入它并使用ifconfig 或其他东西来找出答案。 我有一段时间没有使用 vagrant,但在我使用它的那天 - 它正在工作:) 这适用于我在 Vagrant 2.2.3 中。运行vagrant ssh-config box_name。然后ssh vagrant@&lt;HostName&gt; -p &lt;Port&gt; -i &lt;IdentityFile&gt;(将 中的内容替换为 Vagrant 返回的值。【参考方案7】:

我知道这篇文章很旧,但我想对此补充几点!

你可以试试

vagrant ssh -c "ifconfig | grep inet" hostname 

如果您为您的客人单独设置名字,这将很容易!

【讨论】:

【参考方案8】:

我需要知道这一点来告诉用户要向其主机的主机文件添加什么。 这仅使用 bash 在 vagrant 中对我有用:

external_ip=$(cat /vagrant/config.yml | grep vagrant_ip | cut -d' ' -f2 | xargs)
echo -e "# Add this line to your host file:\n$external_ip     host.vagrant.vm"

【讨论】:

【参考方案9】:

我为此开发了一个小型 vagrant-address 插件。它简单、跨平台、跨供应商,并且不需要编写脚本。

https://github.com/mkuzmin/vagrant-address

【讨论】:

【参考方案10】:

默认情况下,vagrant box 没有任何 IP 地址。为了找到 IP 地址,您只需在 Vagrantfile 中分配 IP 地址,然后调用 vagrant reload

如果您只需要从主机访问 vagrant 机器,那么您只需要设置“专用网络”即可。取消注释默认 Vagrantfile 中的相应行,或添加此 sn-p。如果您希望您的虚拟机出现在172.30.1.5,它将如下所示:

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

详细了解专用网络。 https://www.vagrantup.com/docs/networking/private_network.html

如果您需要在主机之外访问 vagrant,例如针对 iosandroid 等移动设备进行开发,您必须启用公共网络,您可以使用静态 IP,例如 192.168.1.10,或DHCP。

config.vm.network "public_network", ip: "192.168.1.10"

了解更多关于配置公共网络https://www.vagrantup.com/docs/networking/public_network.html

【讨论】:

这应该是答案。他应该从静态 IP 池中修复 IP 地址。或者先创建一个网络设计。【参考方案11】:

在终端类型中:

ip addr show

【讨论】:

我看到了大量的输出。我如何知道所有输出中的 IP 是什么?【参考方案12】:

我发现我确实需要 IP 才能在主机系统上配置 /etc/hosts 以指向新 VM 上的服务。

这是我用来获取 IP 的粗略版本。让 Vagrant 发挥它的 SSH 魔法,向 VM 询问它的地址;根据您的需要进行调整。

new_ip=$(vagrant ssh -c "ip address show eth0 | grep 'inet ' | sed -e 's/^.*inet //' -e 's/\/.*$//'")

我刚刚在Vagrant Docs 中找到了这个。看起来他们认为这是一种有效的方法:

这将自动从保留地址分配一个 IP 地址 空间。可以通过 vagrant ssh 到 SSH 来确定 IP 地址 进入机器并使用适当的命令行工具查找 IP,例如 ifconfig。

【讨论】:

此命令导致包含换行符,当变量用于 curl 等另一个命令(我使用的是 OSX)时,这不起作用。这似乎效果更好:$(vagrant ssh -c "ip address show eth0" 2&gt;/dev/null | sed -ne '/inet / s/\s\+inet \([^\/]\+\).*\r/\1/p') 删除该换行符的更好方法是简单地添加| tr -d '\n',如下所示:vagrant ssh -c "ip address show eth0 | grep 'inet ' | sed -e 's/^.*inet //' -e 's/\/.*$//' | tr -d '\n'" 2&gt;/dev/null 我想通了。虚拟机提供的 IP 不正确,我给虚拟机的 IP 也不是它最终使用的 IP,但我在 VirtualBox 的相关主机接口设置中找到了它。因此,看起来这个答案并不总是有效,但可能在许多情况下都有效。 对于这样一个需要IP的简单用例,你一定是在开玩笑 使用 vagrant ssh -c "..." -- -q 将 ssh 置于安静模式,并且只获取 IP 地址而不发送任何额外消息。【参考方案13】:

我在 VagrantFile 做过:

REMOTE_IP = %x/usr/local/bin/vagrant ssh-config | /bin/grep -i HostName | /usr/bin/cut -d\' \' -f4
run "ping #REMOTE_IP"

如您所见,我使用了 "%x" ruby​​ 函数。

【讨论】:

似乎是特定于主机操作系统的?您使用哪个操作系统作为主机?

以上是关于如何找到流浪IP?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改现有流浪盒的配置?

如何避免PhpStorm中的几个流浪服务器的“传入连接”弹出窗口

TCP/IP高频考点之一个数据包的流浪日记

markdown 如何设置流浪者项目。

markdown 如何设置流浪者项目。

sh 如何彻底摧毁流浪汉机器