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 参数的这种用法不受文档支持,但它可以工作。不接受其他密钥类型(DSSKeyECDSAKeyEd25519Key)。


如果需要使用其他key类型,直接使用Paramiko:SSH/SCP through Paramiko with key in string

pysftp 只是 Paramiko 的一个包装器。 见pysftp vs. Paramiko

【讨论】:

以上是关于Python PYSFTP - 将私钥作为字符串/文本传递,而不是传递文件路径的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 将私钥编码为 RS256 格式的 JSON WEB TOKEN

使用私钥连接到服务器时出现pysftp AuthenticationException

如何将私钥转换为 RSA 私钥?

使用私钥通过 pysftp 连接到 SFTP 服务器时“找不到主机 ***** 的主机密钥”

将私钥存储在数据库中

如何将私钥添加到分发证书?