Python PYSFTP - 将私钥作为字符串/文本传递,而不是传递文件路径
Posted
技术标签:
【中文标题】Python PYSFTP - 将私钥作为字符串/文本传递,而不是传递文件路径【英文标题】:Python PYSFTP - pass private-key as string/text instead of passing file path 【发布时间】:2020-10-31 00:44:13 【问题描述】:我想将我的实际私钥值作为参数传递,而不是提供文件路径。
到目前为止,我已经使用了以下代码:
def upload_file_to_remote(hostname, port, username, password, private_key_filepath, localpath, remotefolder, host_keys):
import pysftp
import os
if password=="None":
password=None
try:
cnopts = pysftp.CnOpts()
if str(host_keys).lower() =='none':
cnopts.hostkeys = None
else:
cnopts.hostkeys.load(hostkeys)
filename = os.path.basename(localpath)
print(filename)
remotepath = os.path.join(remotefolder, filename)
print(remotepath)
with pysftp.Connection(host=hostname, port=int(port), username=username, password=password, cnopts=cnopts,private_key=private_key_filepath) as sftp:
print sftp
sftp.put(localpath, remotepath=remotepath)
except IOError as e:
result="SFTP Failed "+str(e)
return result
except pysftp.exceptions.ConnectionException as e:
return "SFTP Failed "+str(e)
except pysftp.exceptions.CredentialException as e:
return "SFTP Failed "+str(e)
except pysftp.exceptions.HostKeysException as e:
return "SFTP Failed "+str(e)
except Exception as e:
return "SFTP Failed "+str(e)
return 'status':'pass','result' : remotepath
#print(upload_file_to_remote(hostname, port, username, password, private_key_filepath, localpath, remotefolder,host_keys))
upload_file_to_remote(hostname, port, username, password, private_key_filepath, localpath, remotefolder, host_keys)
请提出一些将其作为文本传递的方法。
例子:
private_key='abcdmyprivatekeytext'
upload_file_to_remote(hostname, port, username, password, private_key, localpath, remotefolder, host_keys)
在实际情况中,我会将我的私钥文本放在安全保险库中。
【问题讨论】:
【参考方案1】:pysftp 可以在Connection
constructor 的private_key
参数中接受RSAKey
:
# Set your private key as a string
PRIVATE_KEY = """-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----
"""
# Use 'io.StringIO' to read your string as a file-like object.
privkey = io.StringIO(PRIVATE_KEY)
# Use paramiko to create your RSAKey
ki = paramiko.RSAKey.from_private_key(privkey)
# Connect using your key with pysftp
conn = pysftp.Connection(host=HOST, username=USER, private_key=ki)
(最初由@Hana 发布,但现在已删除答案)
从 pysftp 0.2.9 开始,private_key
参数的这种用法不受文档支持,但它可以工作。不接受其他密钥类型(DSSKey
、ECDSAKey
、Ed25519Key
)。
如果需要使用其他key类型,直接使用Paramiko:SSH/SCP through Paramiko with key in string
pysftp 只是 Paramiko 的一个包装器。 见pysftp vs. Paramiko
【讨论】:
以上是关于Python PYSFTP - 将私钥作为字符串/文本传递,而不是传递文件路径的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 python 将私钥编码为 RS256 格式的 JSON WEB TOKEN
使用私钥连接到服务器时出现pysftp AuthenticationException