假設我開啟了一個到某個 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 製造商。 VM 必須有一個 NIC,因為我們是透過 SSH 連線的。
以下是我從具有 4 個 NIC 的 VM 獲得的資訊:
$ 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 型號預期的不同)。