2016-09-22 7 views
0

я скачиваю некоторые файлы с помощью следующей SSH конфигурации:SFTP с SSH ProxyCommand в питоне

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 [email protected]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, если этого избежать. Какие-либо предложения?

ответ

0

решаемые со следующим:

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 ' 
          '[email protected] 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()) 

 Смежные вопросы

  • Нет связанных вопросов^_^