poi*_*rez 10 google-compute-engine google-cloud-platform
有没有办法从命令行shell了解我目前是在Google Compute Engine机器上还是在其他地方(开发机器)?
Mis*_*man 10
根据元数据文档:
您可以使用元数据服务器轻松检测应用程序或脚本是否在Compute Engine实例中运行.向服务器发出请求时,元数据服务器的任何响应都将包含
Metadata-Flavor: Google
标头.您可以查找此标头以可靠地检测您是否在Compute Engine中运行.例如,以下curl请求返回一个
Metadata-Flavor: Google
标头,表示该请求是在Compute Engine实例中进行的.Run Code Online (Sandbox Code Playgroud)me@my-inst:~$ curl metadata.google.internal -i HTTP/1.1 200 OK Metadata-Flavor: Google Content-Type: application/text Date: Thu, 10 Apr 2014 19:24:27 GMT Server: Metadata Server for VM Content-Length: 22 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN 0.1/ computeMetadata/
这是通过socket.getaddrinfo的python实现
import socket
def is_gce_instance():
"""Check if it's GCE instance via DNS lookup to metadata server.
"""
try:
socket.getaddrinfo('metadata.google.internal', 80)
except socket.gaierror:
return False
return True
Run Code Online (Sandbox Code Playgroud)
小智 6
您还可以对元数据服务器进行 DNS 查找,而不是实际调用它。
例如,在 Google Compute 实例dig +short metadata.google.internal
中执行操作会输出如下内容:
[root@vm-1]# dig +short metadata.google.internal
169.254.169.254
Run Code Online (Sandbox Code Playgroud)
但是,如果您dig +short metadata.google.internal
在 Google Cloud 外部的标准服务器内执行相同的命令 ( ),则可能会得到空响应。
因此,要检查,您需要做的bash
就是(例如):
GMETADATA_ADDR=`dig +short metadata.google.internal`
if [[ "${GMETADATA_ADDR}" == "" ]]; then
echo "I am NOT in a Google VM!"
else
echo "I AM INSIDE a Google VM! Whoohoo!"
fi
Run Code Online (Sandbox Code Playgroud)
如果您不想进行网络呼叫,也可以使用该dmidecode
实用程序探测虚拟硬件:
my@myinst:~$ sudo dmidecode -s bios-vendor | grep Google
Google
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1680 次 |
最近记录: |