python - 如何使用 OS Login API 从 Google Compute 实例中删除或获取 SSH 公钥

标签 python google-compute-engine google-iam

我有一个谷歌计算引擎实例,其默认服务帐户的形式为 <project-number>-compute@developer.gserviceaccount.com .我可以使用我自己生成的一对 SSH key 通过 SSH 连接到我的计算实例。我关注了this guide我在其中使用了 service_account_ssh.py 的略微修改版本脚本。

这按预期工作。用线 oslogin.users().importSshPublicKey(parent=account, body=body).execute()从脚本我可以添加我的公钥。这使我能够像这样简单地通过 SSH 连接到计算实例: ssh -i <private-key> <user>@<compute-instance-ip> 请注意,我没有为 SSH key 使用过期时间,也没有像示例脚本那样在生成后删除它们。

但是,我无法从服务帐户中删除公钥。根据OS Login API , 有一个 users.sshPublicKeys.delete方法,但我无法让它工作。

我遇到的第一个问题是找不到 Python 引用操作系统登录 API。随着service_account_ssh.py以脚本和 OS Login API 为例,我能够派生出 Python 方法:oslogin.users().sshPublicKeys().delete(name=key).execute()

但现在我卡在了 name 上 field 。根据文档 name参数应该是公钥的指纹,格式为users/{user}/sshPublicKeys/{fingerprint}

无论我尝试什么,我都会收到 Python 错误: TypeError: Parameter "name" value "users/<project-number>-compute@developer.gserviceaccount.com/sshPublicKeys/<key-fingerprint>" does not match the pattern "^users/[^/]+/sshPublicKeys/[^/]+$" .出于安全原因,我删除了我的实际值并将它们替换为 <project-number><key-fingerprint>

我用 ssh-keygen -lf <key>.pub 生成我的 key 指纹, 它以 SHA256:sadlkf43jqweIFND123oifja/sdflk3234j 的形式输出内容

因为我不太擅长正则表达式,所以我使用了 https://regexr.com/根据 ^users/[^/]+/sshPublicKeys/[^/]+$ 测试我的字符串.正则表达式似乎与 key 指纹不匹配,因为有一个正斜杠 /在我 key 的指纹中。如果我删除这个 /正则表达式匹配并且我的 python 脚本没有抛出错误,但是,现在 key 指纹无效。

我快速检查了一堆其他 SSH key ,它们的指纹中都有一个正斜杠。但现在我不明白我怎么可能用正确的字符串调用 API。这正是我卡住的地方,我希望有人能帮助我。

我的问题是:如何使用操作系统登录 API 在 Python 中删除(或获取)我的 SSH key ?

最佳答案

首先尝试让用户注册 ssh key 条目。 在控制台上,您可以注意到使用的名称与公钥值相同(在字符串的末尾,有些情况下有主机名)。

为了获取每个键的名称,我编写了以下代码:

from pprint import pprint

from googleapiclient import discovery
from oauth2client.client import GoogleCredentials

credentials = GoogleCredentials.get_application_default()

service = discovery.build('compute', 'v1', credentials=credentials)

# Project ID for this request.
project = '<project>'  # TODO: Update placeholder value.

# The name of the zone for this request.
zone = '<zone>'  # TODO: Update placeholder value.

request = service.instances().list(project=project, zone=zone)
# while request is not None:
response = request.execute()

for instance in response['items']:
    for sshItems in instance['metadata']['items']:
        if sshItems['key'] == 'ssh-keys':
            sshPubKey = sshItems['value']
            sshUser = sshPubKey.split(':',1)[0]
            print(sshUser)

它获取您拥有的所有实例的每个 ssh key 的用户。 然后您可以在您的 URL 中使用正确的用户名。

关于python - 如何使用 OS Login API 从 Google Compute 实例中删除或获取 SSH 公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63704958/

相关文章:

python - 如何根据其他列值合并相同的列值?

python - 使用 Pycharm、Vagrant、Apache 和 mod_wsgi 远程调试 Flask 应用程序

rabbitmq - Chef-Server 12 已被书架、oc_bifrost 和rabbitmq 淘汰

firebase - 从 Cloud Function : IAM Authentication 调用 Cloud Run

node.js - 使用身份感知代理在 Node js App Engine 环境中获取用户 API 访问权限

python - Ajax 成功调用显示带有表单数据的 div

python - 我需要在 Python 中安全地存储用户名和密码,我有哪些选择?

php - 如何以编程方式使用 PHP Lib 在 Google Console Cloud 平台中创建项目?

python - Google VM (Linux) 上的 Pytorch 无法识别 GPU

google-app-engine - 如何正确停止 Google Cloud Datalab