Connection.forward_local фабрики не работает, когда выходит из области видимости - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь получить скрипт Python для включения переадресации портов с удаленного хоста на локальный компьютер для доступа к интерфейсу.

Если я делаю это вручную с помощью ssh -L 54321:someotherhost:80 user@host (с запросом пароля), этоработает отлично, и я могу получить доступ к интерфейсу на http://localhost:54321/someinterface, как и ожидалось.

Теперь я пытаюсь сделать это с тканью:

from fabric import Connection

HOST = "somehost"
USER = "someuser"
PASSWORD = "somepassword"
LOCAL_PORT = "54321"
REMOTE_PORT = "80"
REMOTE_HOST = "someotherhost"

kwargs = {
    "password": PASSWORD
}
with Connection(HOST, user=USER, connect_kwargs=kwargs).forward_local(
        LOCAL_PORT, REMOTE_PORT, REMOTE_HOST, "localhost"
):
    pass # access interface e.g. via the requests package

Однако, 1.) пересылкакажется, не работает, причины неизвестны и 2.) когда выполняется последняя строка в области forward_local, она останавливается со следующей ошибкой:

Traceback (most recent call last):
  File ".\path\to\script.py", line 67, in <module>
    main()
  File ".\path\to\script.py", line 35, in main
    pass
  File "C:\Users\ott\AppData\Local\Programs\Python\Python37\lib\contextlib.py", line 119, in __exit__
    next(self.gen)
  File "C:\Users\ott\AppData\Local\Programs\Python\Python37\lib\site-packages\fabric\connection.py", line 883, in forward_local
    raise ThreadException([wrapper])
invoke.exceptions.ThreadException: 
Saw 1 exceptions within threads (TypeError):

Thread args: {}

Traceback (most recent call last):

  File "C:\Users\ott\AppData\Local\Programs\Python\Python37\lib\site-packages\invoke\util.py", line 231, in run
    self._run()

  File "C:\Users\ott\AppData\Local\Programs\Python\Python37\lib\site-packages\fabric\tunnels.py", line 60, in _run
    sock.bind(self.local_address)

TypeError: an integer is required (got type str)

Возможно 1.) и 2.) связаны, но я остановлюсь на 2.) прямо сейчас.Не имеет значения, что я делаю в контексте диспетчера контекста, создаваемого forward_local, на последнем выполняемом операторе он останавливается.Я предполагаю, что это вызвано чем-то, когда менеджер контекста закрывается python, когда интерпретатор покидает область видимости.

1 Ответ

2 голосов
/ 27 сентября 2019

Согласно документации параметры, такие как:

  • local_port
  • remote_port

должны быть целыми, а не строковыми.Вот почему вы получили:

TypeError: требуется целое число (получил тип str)

Итак, изменение переменных:

LOCAL_PORT = "54321"
REMOTE_PORT = "80"

на

LOCAL_PORT = 54321
REMOTE_PORT = 80

должен решить проблему.

...