我有一个谷歌计算引擎实例,其默认服务帐户的形式为 <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/