【问题标题】:SFTP with an SSH ProxyCommand in python在 python 中使用 SSH ProxyCommand 的 SFTP
【发布时间】:2016-09-22 02:16:40
【问题描述】:

我正在使用以下 SSH 配置下载一些文件:

Host proxy
    Hostname      proxy.example.com
    User          proxyuser
    IdentityFile  ~/.ssh/proxy_id_rsa

Host target       # uses password auth
    Hostname      target.example.com
    User          targetuser
    ProxyCommand  ssh proxy nc %h %p

我正在尝试自动下载文件——目前使用 paramiko,但如果更容易的话,可以使用另一个库。

根据其他一些答案,这是我正在尝试的:

from paramiko.proxy import ProxyCommand
from paramiko.transport import Transport
from paramiko.sftp_client import SFTPClient

proxy = ProxyCommand('ssh -i /Users/ben/.ssh/proxy_id_rsa proxyuser@proxy.example.com nc target.example.com 22')
client = SFTPClient(proxy)
client.connect(username='targetuser', password='targetpassword')

但是,这会引发错误

Traceback (most recent call last):
  File "sftp.py", line 6, in <module>
    client = SFTPClient(proxy)
  File "/Users/ben/.virtualenvs/venv/lib/python3.5/site-packages/paramiko/sftp_client.py", line 99, in __init__
    server_version = self._send_version()
  File "/Users/ben/.virtualenvs/venv/lib/python3.5/site-packages/paramiko/sftp.py", line 105, in _send_version
    t, data = self._read_packet()
  File "/Users/ben/.virtualenvs/venv/lib/python3.5/site-packages/paramiko/sftp.py", line 177, in _read_packet
    raise SFTPError('Garbage packet received')
paramiko.sftp.SFTPError: Garbage packet received

不幸的是,错误消息不是很有帮助,所以我不知道我可以改变什么。我无法更改target 上的配置,如果可以避免,我不希望更改proxy 上的配置。有什么建议吗?

【问题讨论】:

    标签: python ssh proxy sftp paramiko


    【解决方案1】:

    通过以下方式解决:

    class PatchedProxyCommand(ProxyCommand):
        # work around https://github.com/paramiko/paramiko/issues/789
    
        @property
        def closed(self):
            return self.process.returncode is not None
    
        @property
        def _closed(self):
            # Concession to Python 3 socket-like API
            return self.closed
    
        def close(self):
            self.process.kill()
            self.process.poll()
    
    proxy = PatchedProxyCommand('ssh -i /Users/ben/.ssh/proxy_id_rsa '
                                'proxyuser@proxy.example.com nc target.example.com 22')
    
    transport = Transport(proxy)
    key = HostKeyEntry.from_line('target.example.com ssh-rsa '
                                 'AAAAB3NzaC1yc2EAAAA/base64+stuff==').key
    transport.connect(hostkey=key,
                      username='targetuser', password='targetpass')
    sftp = SFTPClient.from_transport(transport)
    
    print(sftp.listdir())
    

    【讨论】:

      猜你喜欢
      • 2016-11-17
      • 2013-06-11
      • 1970-01-01
      • 2014-04-06
      • 2010-12-08
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多