【问题标题】:Fabric's connection.forward_local fails when going out of scopeFabric 的 connection.forward_local 超出范围时失败
【发布时间】: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 关闭上下文管理器引起的。

【问题讨论】:

    标签: python ssh fabric


    【解决方案1】:

    根据documentation参数如:

    • 本地端口
    • remote_port

    必须是整数而不是字符串。这就是你得到的原因:

    TypeError:需要一个整数(类型为 str)

    所以,改变变量:

    LOCAL_PORT = "54321"
    REMOTE_PORT = "80"
    

    LOCAL_PORT = 54321
    REMOTE_PORT = 80
    

    应该解决问题。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2011-06-09
      • 2012-05-08
      • 2012-05-04
      • 1970-01-01
      相关资源
      最近更新 更多