我在 VirtualBox 客户端上安装了 Ubuntu Desktop 14.04 (Trusty)(桥接网络连接,安装了 Guest Additions)。我有时会以无头模式运行客户端(而不是通过 VirtualBox GUI)并通过 SSH 访问它。要启动这样的客户端并获取其网络地址,我通常会:
nohup VBoxHeadless --startvm <VM_NAME> & #start as background process
#wait a bit for it to start up
VBoxManage guestproperty get <VM_NAME> "/VirtualBox/GuestInfo/Net/0/V4/IP"
这适用于大多数客户端(Debian、Windows,我不记得它是否适用于我的 Ubuntu 13.10 客户端)。如果失败,我可以请求所有详细信息,但即使在这里,网络地址也不会出现。
VBoxManage guestproperty enumerate <VM_NAME>
我的 14.04 客户端的 guestproperties 如下:
Name: /VirtualBox/GuestInfo/OS/Product, value: Linux, timestamp: 1402485749624026000, flags:
Name: /VirtualBox/HostInfo/GUI/LanguageID, value: en_US, timestamp: 1402652779530499000, flags:
Name: /VirtualBox/HostInfo/VBoxVerExt, value: 4.3.12, timestamp: 1402652779119725000, flags: TRANSIENT, RDONLYGUEST
Name: /VirtualBox/GuestAdd/Vbgl/Video/SavedMode, value: 1366x722x32, timestamp: 1402485750186131000, flags:
Name: /VirtualBox/GuestInfo/OS/Version, value: #53-Ubuntu SMP Wed Jun 4 21:02:19 UTC 2014, timestamp: 1402485749625558000, flags:
Name: /VirtualBox/GuestAdd/VersionExt, value: 4.3.12, timestamp: 1402485749627827000, flags:
Name: /VirtualBox/GuestAdd/Revision, value: 93733, timestamp: 1402485749628338000, flags:
Name: /VirtualBox/HostGuest/SysprepExec, value: , timestamp: 1402652779118360000, flags: TRANSIENT, RDONLYGUEST
Name: /VirtualBox/HostGuest/SysprepArgs, value: , timestamp: 1402652779118595000, flags: TRANSIENT, RDONLYGUEST
Name: /VirtualBox/GuestAdd/Version, value: 4.3.12, timestamp: 1402485749627214000, flags:
Name: /VirtualBox/HostInfo/VBoxRev, value: 93733, timestamp: 1402652779119840000, flags: TRANSIENT, RDONLYGUEST
Name: /VirtualBox/HostInfo/VBoxVer, value: 4.3.12, timestamp: 1402652779119633000, flags: TRANSIENT, RDONLYGUEST
Name: /VirtualBox/GuestInfo/OS/Release, value: 3.13.0-29-generic, timestamp: 1402485749624971000, flags:
Name: /VirtualBox/GuestAdd/HostVerLastChecked, value: 4.3.12, timestamp: 1402485781945719000, flags:
我的解决方法是使用 VBox GUI 启动客户端,登录并输入ifconfig
以获取地址,关闭它,然后再次以无头模式启动它,但我更愿意避免这样做。如何从无头 Trusty VirtualBox 客户端获取网络地址?
答案1
找到您要获取地址的网络接口的 mac 地址。您可以使用
ifconfig
或我认为它在虚拟接口的机器配置中列出。从主机(或你用于 ssh 的任何机器)安装arp 扫描...
sudo apt-get install arp-scan
arp-scan 列出网络上的所有 mac 和 ip 地址对。然后运行 arp-scan 并 grep 出你想要的 mac 地址的命令看起来类似于
sudo arp-scan 10.253.0.0/24 | grep -i <mac address>
如果您有多个接口,则可能必须指定一个接口--interface=eth0
。并且您的网络和子网可能不同。
现在,为了获得额外的积分,您可以使用awk
只提取 IP 地址并组合您的 ssh 命令,并在一个小脚本中完成所有操作。
这就是我要做的。
伪代码:
start vm
sleep 1 min
ip=$(apr-scan | grep | awk print $2)
echo $ip
ssh <user>@$ip
答案2
这似乎是由于机器启动后在 GNU GRUB 屏幕上等待(在预览中可见)造成的。通过 GUI 启动一次(以获取登录屏幕),停止它,然后无头启动它似乎可以工作。
我猜想它会在内核或 Guest Additions 更新后等待 GRUB。(但我不确定。)
答案3
arp 方法的问题是 - 您必须先初始化与该框的 TCP/IP 或 UDP 通信,然后才能在系统 arp 表中找到它。
所以你必须知道 IP;)——鸡和蛋的问题。
但是这种方法应该可行:
VBoxManage list runningvms
"some_box_default_1486476025646_64328" {d20b1b0e-a5xf-4afc-94e0-4ea78d70539f}
VboxManage guestproperty get {d20b1b0e-a5xf-4afc-94e0-4ea78d70539f} /VirtualBox/GuestInfo/Net/1/V4/IP
Value: 10.XX.XX.XX
Net/0 for eth0 Net1 for eth1
答案4
经过一番寻找却无果,我找到了这篇文章:https://itsfoss.com/how-to-find-what-devices-are-connected-to-network-in-ubuntu/
简历中:
- 使用 ifconfig 了解你的 IP
- 使用 nmap nmap -sn 你的 ip/24
它显示所有连接到 LAN 的设备,如果设备很少,就很容易知道您的虚拟机 IP。