本文档介绍如何使用元数据服务器排查 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: ConsoleWhen you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication. gcloud- 
 
 
  
  
   
   
  
   
   
  
   
   
     
   
  
  
   
   
  
   
   
  
   
   
  
 
 
   
   
      安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI: gcloud init如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。 
- Set a default region and zone.
 REST如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭证。 安装 Google Cloud CLI。 安装完成后,运行以下命令来初始化 Google Cloud CLI: gcloud init如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。 如需了解详情,请参阅 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. 如需解决这些错误,请执行以下操作: - 运行 - 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替换为密钥的指纹或密钥字符串。
 为防止将来出现此问题,请为 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参数。将pagesize替换为所需的数值。curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=PAGE_SIZE" -H "Metadata-Flavor: Google" 输出可能包含一个网页令牌,可在后续调用中使用该令牌来列出更多用户。 例如,如需将 pagesize设置为1,请运行以下命令:curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=1" -H "Metadata-Flavor: Google" 如需获取下一位用户,请将 pagesize设置为1,并将pagetoken设置为上一个命令输出中的网页令牌。curl "http://metadata.google.internal/computeMetadata/v1/oslogin/users?pagesize=1&pagetoken=PAGE_TOKEN" -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查询参数。- 查询用户个人资料以获取 - 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" 
 例如,您可以查询在上一部分查看的用户 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/ 如果未找到服务账号,则输出为空。 后续步骤- 详细了解 OS Login。
- 了解到 Linux 虚拟机的 SSH 连接在 Compute Engine 上的工作原理。
- 如需查看分步说明,请参阅以下内容之一:
- 管理组织中的 OS Login
 如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。 最后更新时间 (UTC):2025-10-19。 -