Я пытаюсь получить скрипт 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, когда интерпретатор покидает область видимости.