【发布时间】:2019-09-27 21:10:25
【问题描述】:
我正在尝试获取一个 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 关闭上下文管理器引起的。
【问题讨论】: