首页 > 解决方案 > SSHTunnelForwarder - “IP 不是字符串 (NoneType)”

问题描述

我正在尝试使用 SSHTunnelForwarder。我收到错误“IP 不是字符串 (NoneType)”。如果我理解正确,这意味着我传递的主变量是 NoneType 类型,并且需要是 String 类型。打印出变量类型表明它是字符串类型:<class 'str'>。

我已经概括了有问题的代码。见下文:

def connectToClient(client):
    key, host = getClientInfo(client)
    # Both of the below print statements return <class 'str'>
    print(type(key))
    print(type(host))

    try:
        with SSHTunnelForwarder(
            ssh_username = "username",
            ssh_private_key = key,
            remote_bind_address = (host, 22)) as server:
                # Do stuff here

    except Exception as e:
        # Handle exception

堆栈跟踪(编辑以隐藏文件系统信息和 .py 文件名。也使用 0.0.0.0 进行测试):

Traceback (most recent call last):
  File "/path/to/file/myPythonFile.py", line 83, in connectToClient
    remote_bind_address = ('0.0.0.0', 22)) as server:
  File "/path/to/file/lib/python3.6/site-packages/sshtunnel.py", line 908, in __init__
    check_host(self.ssh_host)
  File "/path/to/file/lib/python3.6/site-packages/sshtunnel.py", line 79, in check_host
    type(host).__name__
AssertionError: IP is not a string (NoneType)

我想指出的是,即使我将主机变量替换为包含 IP 的字符串(即“127.0.0.1”),我仍然会收到相同的错误。

也许我犯了一个简单的错误。有任何想法吗?

编辑:修复格式并添加堆栈跟踪

标签: pythonpython-3.xsshssh-tunnel

解决方案


你错过了一个论点。请参阅示例
实际上,您在调用SSHTunnelForwarder时不使用代表 IP 的关键字参数ssh_address_or_host以及可选的远程主机的端口号。
确实,您混淆了remote_bind_address使用它的含义,因为它是ssh_address_or_host.

当该方法将检查相对于 IP 的主机部分时,将找不到字符串,但是 None 并且出现了异常。见代码


推荐阅读