假设我打开了一个到 IP 地址的 ssh 会话。我能否从 ssh 会话中判断该 ssh 会话是在 VirtualBox 客户虚拟机上运行,还是在非虚拟机上运行?
笔记:
- 操作系统主机/客户机:CentOS 7
- 虚拟盒:6.0
答案1
是的,您可以使用它dmidecode
来实现这一点:
sudo yum install dmidecode
sudo dmidecode -s system-manufacturer
例如,在我的 VMware Workstation CentOS VM 中它返回以下内容:
VMware, Inc.
在您的 VirtualBox VM 中它将返回:
innotek GmbH
来源:https://www.ostechnix.com/check-linux-system-physical-virtual-machine/
答案2
以下是基于我在另一个论坛上收到的答案。
一种快捷方式是查询 NIC 制造商。由于我们通过 SSH 连接,因此虚拟机必须有 NIC。
以下是我从具有 4 个 NIC 的虚拟机获得的信息:
$ ifconfig | grep ether
ether 08:00:27:ae:2c:b5 txqueuelen 1000 (Ethernet)
ether 08:00:27:1d:8b:9f txqueuelen 1000 (Ethernet)
ether 08:00:27:15:c6:f7 txqueuelen 1000 (Ethernet)
ether 08:00:27:64:bd:3b txqueuelen 1000 (Ethernet)
该08:00:27
部分显示 NIC 制造商是 VirtualBox(即,我们在虚拟机中)。
其他方法可以从操作系统获取硬件信息,例如:
$ lshw | grep -i virtualbox
WARNING: you should run this program as super-user.
WARNING: output may be incomplete or inaccurate, you should run this program as super-user.
product: VirtualBox Graphics Adapter
product: VirtualBox Guest Service
如果Guest Additions
安装了以下物品,我们可以有进一步的证据:
$ VBoxControl -version
6.0.0r127566
但我认为应该使用第一个技巧(使用 MAC 地址)。
编辑1:
运行这些来获取ssh
环境:
if [[ $(ifconfig | grep '08:00:27') ]] ; then echo "We're in Virtualbox VM" ; fi
lshw | grep -i virtualbox
VBoxControl -version
if [[ "innotek GmbH" == "$( sudo dmidecode -s system-manufacturer)" ]] ; then echo "We're in Virtualbox VM" ; fi
答案3
如果虚拟机没有配置为欺骗您,那么这里其他答案中介绍的技术就可以了。
但是如果虚拟机配置成欺骗你(例如 MAC 地址可以是任意的),那么你就需要更加努力了。你可能能够在 /proc/* 中发现不一致之处(例如,可用内核数与 CPU 型号的预期内核数不同)。