具有相同区域的多个 SSH TCP 端口 22 隧道

问题描述

我目前正在使用多个 RaspBerry Pi 启动一个项目。我已经有一个系统,如果代码失败,请在端口 22 上打开 ssh 隧道。但是,如果两个或多个 RaspBerry Pi 出现故障,则只有一个可以在区域 'au' 的端口 22 (tcp) 上打开隧道。通过 ssh 访问它

def ssh():
    ngrok.set_auth_token("MY_SECRET_TOKEN")
    conf.get_default().region = 'au'
    ssh = ngrok.connect(22,"tcp")
    ngrok_process = ngrok.get_ngrok_process()
    try:
        ngrok_process.proc.wait()
    except KeyboardInterrupt:
        ngrok.kill

我已经与 Ngrok 的支持人员取得联系,他们提到在端口 22 (tcp) 上可能有多个隧道。

在免费计划中,您只能有一个打开的 ngrok“会话”,但您最多可以通过该会话运行 4 条隧道。您所有的隧道都可以通向端口 22,这样可以正常工作。 - Ngrok 支持

可能是指具有不同的端口隧道(22、80)

是的,您可以在一个会话中在“au”区域中打开多个隧道

当前收到此错误

Traceback (most recent call last):
  File "/home/pi/main.py",line 210,in <module>
    ssh()
  File "/home/pi/main.py",line 30,in ssh
    ssh = ngrok.connect(22,"tcp")
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/ngrok.py",line 245,in connect
    api_url = get_ngrok_process(pyngrok_config).api_url
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/ngrok.py",line 162,in get_ngrok_process
    return process.get_process(pyngrok_config)
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/process.py",line 295,in get_process
    return _start_process(pyngrok_config)
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/process.py",line 465,in _start_process
    ngrok_process.startup_error)
pyngrok.exception.PyngrokNgrokError: The ngrok process errored on start: Your account is limited to 1 simultaneous ngrok client session.\nActive ngrok client sessions in region 'au':\n  - ts_1opHl3G90CmgGPiP6JM0IUpcXZM (IP)\r\n\r\nERR_NGROK_108\r\n.

是否可以在一个会话中打开多个 ngrok.connect(22,"tcp") 隧道并打开区域“AU”?

解决方法

是的,付费 ngrok 帐户可以做到这一点。您可以简单地多次调用 connect()

from pyngrok import ngrok,conf

ngrok.set_auth_token("MY_AUTH_TOKEN")
conf.get_default().region = "au"

ssh1 = ngrok.connect(22,"tcp")
print(ssh1.public_url)
ssh2 = ngrok.connect(22,"tcp")
print(ssh2.public_url)
ssh3 = ngrok.connect(22,"tcp")
print(ssh3.public_url)
ssh4 = ngrok.connect(3306,"tcp")
print(ssh4.public_url)
http1 = ngrok.connect(8080,bind_tls=True)
print(http1.public_url)
http2 = ngrok.connect(8080,bind_tls=True)
print(http2.public_url)

print(len(ngrok.get_tunnels()))

ngrok_process = ngrok.get_ngrok_process()
try:
    ngrok_process.proc.wait()
except KeyboardInterrupt:
    ngrok.kill()

上面的例子将导致总共 6 个隧道,混合多个 TCP 隧道(到相同和不同的端口)和多个 HTTP 隧道。

这将适用于免费帐户。假设您的有效身份验证令牌已成功注册到 pyngrok(可能是这里的问题?),我会向他们发送代码段 ts_1opHl3G90CmgGPiP6JM0IUpcXZM (IP)\r\n\r\nERR_NGROK_108\r\n,因为这看起来像是他们为您的请求生成的调试代码.或许将这些提供给 ngrok 支持人员可以帮助他们缩小问题所在。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...