本文档介绍如何使用元数据服务器排查 OS Login 问题。如需了解如何设置 OS Login 或获取分步说明,请参阅设置 OS Login。
您可以从虚拟机实例中查询元数据服务器。 如需了解详情,请参阅存储和检索实例元数据。
准备工作
-
如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
- Set a default region and zone.
运行
gcloud compute os-login describe-profile
命令查看您的 OS Login 配置文件:gcloud compute os-login describe-profile
输出类似于以下内容:
name: '00000000000000' posixAccounts: ... sshPublicKeys: ...: fingerprint: ... key: | ssh-rsa AAAAB3NzaC1yc2... name: ... ...
查看输出内容,找出所有未使用的 SSH 密钥。
使用
gcloud compute os-login ssh-keys remove
命令从输出中移除所有未使用的密钥:gcloud compute os-login ssh-keys remove --key=KEY
将
KEY
替换为密钥的指纹或密钥字符串。查询用户个人资料以获取
name
字段的值:curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=user_example_com" -H "Metadata-Flavor: Google"
在输出中,记下
name
。使用
name
的值运行以下login
命令:curl "http://metadata.google.internal/computeMetadata/v1/oslogin/authorize?policy=login&email=LOGIN_NAME" -H "Metadata-Flavor: Google"
- 详细了解 OS Login。
- 了解到 Linux 虚拟机的 SSH 连接在 Compute Engine 上的工作原理。
- 如需查看分步说明,请参阅以下内容之一:
- 管理组织中的 OS Login
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
常见的错误消息
以下是使用 OS Login 时可能遇到的常见错误的示例。
找不到群组名称
在某些使用操作系统登录的虚拟机上,您可能会在建立连接后收到以下错误消息:
/usr/bin/id: cannot find name for group ID 123456789
忽略此错误消息。此错误不会影响您的虚拟机。
获取群组失败
创建虚拟机时,您可能会看到如下所示的日志:
Dec 10 22:31:05 instance-1 google_oslogin_nss_cache[381]: oslogin_cache_refresh[381]: Refreshing group entry cache Dec 10 22:31:05 instance-1 google_oslogin_nss_cache[381]: oslogin_cache_refresh[381]: Failure getting groups, quitting
这些日志表明您的组织未配置 OS Login Linux 群组。请忽略这些消息。
Failed precondition
使用 SSH 连接到虚拟机时,您可能会看到如下所示的错误:
ERROR: (gcloud.compute.ssh) FAILED_PRECONDITION: The specified username or UID is not unique within given system ID.
如果 OS Login 尝试生成一个在组织中已存在的用户名,就会发生此错误。当用户账号被删除,并且不久后又创建了使用相同电子邮件地址的新用户时,这种情况很常见。在用户账号删除后,系统需要长达 48 小时才能移除该用户的 POSIX 信息。
如需解决此问题,请执行以下某项操作:
参数无效
使用 SSH 连接到虚拟机或使用 SCP 传输文件时,您可能会看到如下所示的错误:
ERROR: (gcloud.compute.ssh) INVALID_ARGUMENT: Login profile size exceeds 32 KiB. Delete profile values to make additional space.
ERROR: (gcloud.compute.scp) INVALID_ARGUMENT: Login profile size exceeds 32 KiB. Delete profile values to make additional space.
如需解决这些错误,请执行以下操作:
为防止将来出现此问题,请为 SSH 密钥添加过期时间。过期的密钥将在过期后 48 小时或在向配置文件添加新密钥时,自动从您的登录配置文件中移除。
HTTP 响应代码:429
尝试使用 SSH 连接到虚拟机时,您可能会看到以下错误:
Failed to validate organization user USERNAME has login permission, got HTTP response code: 429
此问题是由每个虚拟机实例每秒 100 次查询的元数据服务器速率限制引起的。此限制无法调整。如需解决此问题,请等待几秒钟,然后重试连接。
为了防止日后出现此问题,请尝试执行以下操作:
默认 OS Login 元数据条目
Compute Engine 定义了一组提供 OS Login 信息的默认元数据条目。默认元数据始终由服务器定义和设置。默认元数据键区分大小写。
下表介绍了您可以查询的条目。
相对于 http://metadata.google.internal/computeMetadata/v1/
元数据条目 说明 project/attributes/enable-oslogin
检查当前 Google Cloud 项目是否已启用 OS Login。 instance/attributes/enable-oslogin
检查当前虚拟机是否已启用 OS Login。 oslogin/users/
检索 OS Login 用户的个人资料信息。 您可以传递 username
、uid
、pagesize
和pagetoken
等查询参数。oslogin/authorize/
检索 OS Login 用户的登录或管理级别权限设置。
要检查权限,您必须指定
policy
查询参数。 政策参数的值必须设置为login
(用于检查登录权限)或adminLogin
(用于检查 sudo 访问权限)。检查是否已配置 OS Login
使用 Google Cloud 控制台或 Google Cloud CLI 查询元数据以确定是否已启用 OS Login。在项目或实例元数据中将
enable-oslogin
元数据键设置为TRUE
时,系统会启用 OS Login。如果同时设置了实例元数据和项目元数据,则实例元数据中设置的值优先。查看 OS Login 用户
要查看多个用户的个人资料信息,您需要指定
pagesize
和pagetoken
参数。将pagesize
和pagetoken
替换为所需的数值。curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=PAGE_SIZE& pagetoken=PAGE_TOKEN" -H "Metadata-Flavor: Google"
例如,要将
pagesize
设置为1
,将pagetoken
设置为0
,请运行以下命令:curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=1&pagetoken=0" -H "Metadata-Flavor: Google"
在大多数发行版上,您还可以运行 Unix 命令
getent passwd
来检索组织用户的密码条目。查看特定的 OS Login 用户
要查看虚拟机上特定用户的个人资料信息,请运行以下命令:
curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=USERNAME" -H "Metadata-Flavor: Google"
将
USERNAME
替换为您要查询的用户的用户名。例如,您可以执行请求来查找用户
user_example_com
。以下命令和输出增加了格式,以提高可读性。curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?username=user_example_com" -H "Metadata-Flavor: Google"
输出类似于以下内容:
{ "loginProfiles": [{ "name": "12345678912345", "posixAccounts": [{ "primary": true, "username": "user_example_com", "uid": "123451", "gid": "123451", "homeDirectory": "/home/user_example_com", "operatingSystemType": "LINUX" }], "sshPublicKeys": { "204c4b4fb...": { "key": "ssh-rsa AAAAB3Nz...", "fingerprint": "204c4b4fb..." } } }] }
在大多数发行版上,您还可以运行
getent passwd username
或getent passwd uid
等 Unix 命令来检索个人资料信息。要检索用户的 SSH 密钥,您还可以运行
/usr/bin/google_authorized_keys USERNAME
。 如果未返回密钥,则说明用户可能没有登录虚拟机所需的权限。检查登录权限
要查看登录权限和管理级别权限,您必须提供
policy=login&email=LOGIN_NAME
查询参数。例如,您可以查询在上一部分查看的用户
user_example_com
的登录权限:curl "http://metadata.google.internal/computeMetadata/v1/oslogin/authorize?policy=login&email=12345678912345" -H "Metadata-Flavor: Google"
命令输出表明用户有权登录虚拟机:
{"success":true}
检查您的虚拟机是否有服务账号
您可以查询元数据服务器以查找与您的虚拟机关联的服务账号。在虚拟机上,运行以下命令:
curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/" -H "Metadata-Flavor: Google"
输出类似于以下内容:
12345-sa@developer.gserviceaccount.com/ default/
如果未找到服务账号,则输出为空。
后续步骤
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-07-08。
-