0

我目前正在使用多个 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”区域的隧道?

4

1 回答 1

0

是的,这可以通过付费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支持将帮助他们缩小问题所在。

于 2021-02-23T00:19:21.030 回答