как дать команду прокси-сервера sftp в скрипте python с помощью paramiko?

Я хочу использовать прокси-команду в python с помощью paramiko.

команда прокси:

sftp -o "ProxyCommand /usr/bin/nc --proxy proxy.somegateway.com:8080 %h %p"

но когда я использую это напрямую, я могу подключить sftp-сервер.

но если я хочу использовать эту прокси-команду в сценарии Python, я получаю следующую проблему:

Мой сценарий:

>>> import paramiko
>>> cmd = '/usr/bin/ssh proxy.somegateway.com:8080'
>>> proxy = paramiko.ProxyCommand(cmd)
>>> proxy
<paramiko.proxy.ProxyCommand object at 0x23b3bd0>
>>> client = paramiko.SSHClient()
>>> client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> client.connect(hostname='some.host.com', username='myuser', password='secretpassword', sock=proxy)
No handlers could be found for logger "paramiko.transport"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/paramiko/client.py", line 366, in connect
    t.start_client(timeout=timeout)
  File "/usr/lib/python2.7/site-packages/paramiko/transport.py", line 510, in start_client
    raise e
paramiko.ssh_exception.ProxyCommandFailure: ('/usr/bin/ssh proxy.somegateway.com:8080', 'Broken pipe')

Я получаю ProxyCommandFailure проблему.


person Community    schedule 28.10.2017    source источник
comment
Пожалуйста, не портите свои посты. Размещая в сети Stack Exchange, вы предоставляете SE безотзывное право на распространение этого контента (в соответствии с лицензия CC BY-SA 3.0). Согласно политике SE, любой вандализм будет пресекаться. Если вы хотите отменить связь этого сообщения со своей учетной записью, см. раздел Как правильно отправить запрос на удаление связи?   -  person adiga    schedule 09.11.2017


Ответы (2)


Это должно быть так:

target_host = 'sftp.foo.com'
target_port = 22
proxy = paramiko.proxy.ProxyCommand(
    '/usr/bin/nc --proxy proxy.bar.com:8080 %s %d' \
    % (target_host, target_port) )
client.connect(hostname=target_host, port=target_port, password='...', sock=proxy)
#                                                                      ^^^^^^^^^^

Подробнее см. в документе от paramiko.

person pynexj    schedule 29.10.2017
comment
Привет pynexj, Спасибо за ваш ответ. сейчас он подключается, но когда я пытаюсь запустить команду ls, я получаю сообщение. Эта служба разрешает только соединения sftp. команда выполнения: - person ; 30.10.2017
comment
(stdin, stdout, stderr) = client.exec_command(ls) для строки в stdout.readlines(): print(line) - person ; 30.10.2017
comment
на основании сообщения об ошибке удаленный SSH-сервер разрешает только SFTP, поэтому вы не можете вызывать exec_command(). вы можете проверить это, подключившись к нему вручную по ssh. - person pynexj; 30.10.2017
comment
Я исчерпал лимит вопросов, поэтому не могу создать новый. не могли бы вы помочь мне с этой проблемой? Эта служба разрешает только соединения sftp - person ; 30.10.2017
comment
я сам никогда не настраивал серверы только sftp. вам нужно проверить SSH conf на стороне сервера. нашел ссылку: serverfault.com/questions/354615/allow -sftp-но-запретить-ssh - person pynexj; 30.10.2017

Только не забудьте добавить hostname и port в команду прокси

target_host = 'foo'
target_port = 22
proxy = paramiko.proxy.ProxyCommand('/usr/bin/nc --proxy proxy.bar.com:8080 %s %d' % (target_hostname, target_port) )

дополнительная информация здесь

person Aziz Alto    schedule 13.04.2019