带有键值的 SSHTunnel(不是路径)

Posted

技术标签:

【中文标题】带有键值的 SSHTunnel(不是路径)【英文标题】:SSHTunnel with key value (not path) 【发布时间】:2021-08-03 07:20:56 【问题描述】:

我有一个 SSH 密钥存储在一个变量中,因为我正在使用云功能并且无权访问文件系统。例如:

with SSHTunnelForwarder(
   ssh_address_or_host='my-host', 
   ssh_username='my-user',
   ssh_pkey='/home/david/.ssh/id_rsa' # this
) as tunnel:

我不能将路径传递给ssh_pkey 文件,而是如何将其硬编码为字符串?是的,我会将它移动到环境变量或其他东西,但是为了测试,有没有办法将它传递给一个字符串?

【问题讨论】:

【参考方案1】:

这就是我为 GCP Cloud Functions 解决它的方法。首先,我使用 Python 打印出我的密钥文件“temp_key.pem”的 base64 编码密钥。我这样做的原因是因为复制和粘贴密钥在 GCP 环境变量中不起作用,即使它在本地进行:

import base64
with open('temp_key.pem', 'rb') as f:
    blob = base64.b64encode(f.read())

print(blob)
for_google_cloud_function = blob.decode('utf-8')
print(for_google_cloud_function)

我使用了我的环境变量 SSH_KEY_BLOB 的输出。然后在我的 GCP Cloud Function 中添加了这个(我错过了从 GCP 环境变量中获取它的行):

# decode key back into a useable form from base64
SSH_KEY_BLOB_DECODED = base64.b64decode(SSH_KEY_BLOB)
SSH_KEY = SSH_KEY_BLOB_DECODED.decode('utf-8')

# pass key to parmiko to get your pkey
pkey = paramiko.RSAKey.from_private_key(io.StringIO(SSH_KEY))

# setup your SSHTunnel like normal
server = SSHTunnelForwarder(
    remote_server_ip,
    ssh_username=SSH_USERNAME,
    ssh_pkey=pkey,
    remote_bind_address=('127.0.0.1', 27017)
)

这样,密钥不会被硬编码,并且文件中的功能是自给自足的。它们可能是更好的方法,但这对我有用。

【讨论】:

【参考方案2】:

正如@TimRoberts 评论的那样,ssh_pkey 接受 paramiko.pkey.PKey 实例,而不仅仅是密钥文件的路径。

有关如何从字符串构造PKey 的示例,请参阅:SSH/SCP through Paramiko with key in string

【讨论】:

以上是关于带有键值的 SSHTunnel(不是路径)的主要内容,如果未能解决你的问题,请参考以下文章

检查对象数组中是不是存在具有特定键值的对象

JavaScript:检查对象数组中是不是存在重复的键值并删除所有但最近添加的具有该键值的对象

获取值的键而不是获取键值? [复制]

QSettings如何在没有键值的情况下读取ini

如何比较每个字典中 JSON Array 键值的字符串以查看它们是不是包含 NSUserDefault 字符串并返回 JSON 字典匹配项

我可以使用啥查询从选定键值的本地存储中获取数据