如何找到流浪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 我遇到了这样的事情,所以我在 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 <virtual-box-machine-name>
【参考方案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@<HostName> -p <Port> -i <IdentityFile>
(将 中的内容替换为 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,例如针对 ios 或 android 等移动设备进行开发,您必须启用公共网络,您可以使用静态 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>/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>/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?的主要内容,如果未能解决你的问题,请参考以下文章