【问题标题】:Looking for an example to load/use a public ssh key with pysftp寻找使用 pysftp 加载/使用公共 ssh 密钥的示例
【发布时间】:2017-09-07 12:16:52
【问题描述】:

我正在使用 pysftp 在 python 中编写一个脚本来建立 sftp 连接。此脚本将在 Windows (Server 2012R2) 中运行。我安装的 pysftp 版本需要主机密钥,所以我联系了我的供应商并从他们那里获得了公钥。我想不通的是如何在我的 pysftp 连接中使用这个公钥。我了解在 pysftp 0.2.9 中有一个新属性(remote_server_key),但我找不到任何如何使用它的示例,我也无法使用cnopts.hostkeys = none

有没有人举例说明如何为 sftp 服务器/主机使用/集成特定的公钥?

请注意,这与我的连接的私钥/公钥对无关(我有这些密钥并且它们工作正常) - 这是关于主机的公钥。

【问题讨论】:

  • 我也在寻找这方面的例子。到目前为止没有运气。
  • 您能详细说明一下吗?
  • 是的,我在下面发布了“答案”解决方法。希望对你有帮助!

标签: python public-key-encryption pysftp


【解决方案1】:

好的,所以我将用一种解决方法来“回答”这个问题。我最终做的是在 paramiko/pysftp 的“预期”位置创建与 known_hosts 文件等效的文件。

首先您生成一个 known_hosts 文件。简单的参数是 sftp 主机的 FQDN(或 IP 地址)和您要连接的服务器的公钥。

例子:

sftp.myserver.com ssh-rsa AAB3nzawerdvDLGiyasdf...

创建该文件(并命名为 known_hosts)后,使用提升的命令提示符或 powershell 会话在将运行脚本的用户的主目录的根目录下创建一个 .ssh 目录。

cd c:\Users\serviceaccount

md .ssh

然后将 known_hosts 文件复制到该目录中。

现在设置您的 pysftp 会话:

import pysftp
cnopts = pysftp.CnOpts()
sftpConnect = pysftp.Connection(host="sftp.myserver.com", username="myusername", private_key="c:\\path\to\my\openssh.key", private_key_pass="randompassword", port=22, cnopts=cnopts)

刚才对我有用。

【讨论】:

  • 你从哪里得到private_key_pass 变量?我假设您使用的是主机提供的公共 ssh 密钥。
  • 我使用putty keygen生成公私钥对,并将公钥分享给接收者。
  • @AlexF 如果密钥是使用密码创建的,您需要将该密码提供为private_key_pass。您的密钥可能没有密码,在这种情况下,您只需将路径传递给密钥。
【解决方案2】:

请注意,.pem 文件格式应如下所示(我通过 puttygen 生成)

-----BEGIN RSA PRIVATE KEY-----
MIIEog***********************************************
*****************************************************
-----END RSA PRIVATE KEY-----

使用以下代码执行传输。

import pysftp
hostname = 's-ad7**********.server.transfer.us-east-1.amazonaws.com'
username = '***'
path = 'C:\\keys\\<your_private_key_file>.pem'
def sftptransfer():
    cnopts = pysftp.CnOpts()
    cnopts.hostkeys = None  
    with pysftp.Connection(hostname, username=username, private_key=path, cnopts=cnopts) as sftp:
        sftp.put('<path of input file>', '<target directory path>') # target dirctory path is optional
        sftp.close()

sftptransfer()      

【讨论】:

    猜你喜欢
    • 2014-03-17
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 2013-07-05
    • 2016-05-19
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多