在后台运行时查看随机的ngrok网址

57

当我使用./ngrok tcp 22启动ngrok客户端时,它会在前台运行,并且我可以看到随机生成的转发URL,例如tcp://0.tcp.ngrok.io:12345 -> localhost:22

如果我使用./ngrok tcp &在后台运行,我找不到任何方式来查看转发URL。如何在后台运行ngrok并仍然能够查看URL?

16个回答

65

有几种方法。

你可以选择:

1) 在浏览器中访问 localhost:4040/status 来查看一些信息,或者

2) 使用curl命令请求API:localhost:4040/api/tunnels


26
如果你想获取第一个隧道,那么jq将是你的好朋友:
curl -s localhost:4040/api/tunnels | jq -r '.tunnels[0].public_url'

如果运行多个ngrok实例,则使用隧道名称/api/tunnels/:name


1
在zsh中由于某种原因,我不得不在'['和']'前加'', 所以这里我不得不运行curl -s localhost:4040/api/tunnels | jq -r .tunnels\[0\].public_url。但完美地运行了,谢谢! - Henrique Bruno
4
为了便于移植性,您可以使用双引号:curl -s localhost:4040/api/tunnels | jq -r ".tunnels[0].public_url"。该命令的作用是获取本地主机的公共URL地址,并使用JSON解析器jq进行格式化输出。 - François Leblanc
真的!我还没有想过这个。谢谢! - Henrique Bruno
@François Leblanc 谢谢! - Elon
如果您不想安装jq,可以使用以下脚本:#!/bin/bashngrok_output=$(curl --silent --show-error http://127.0.0.1:4040/api/tunnels)

查找ngrok分配的子域名:

ngrokUrl=$(echo $ngrok_output | sed -nE 's/.public_url":"https:..([^"]).*/\1/p')
- Ryan

19

这个小 Python (2.7) 脚本将调用 ngrok API 并打印当前的 URL:

import json
import os 

os.system("curl  http://localhost:4040/api/tunnels > tunnels.json")

with open('tunnels.json') as data_file:    
    datajson = json.load(data_file)


msg = "ngrok URL's: \n'
for i in datajson['tunnels']:
  msg = msg + i['public_url'] +'\n'

print (msg)

我如何使用Python3中的urllib.urlopen来完成它?我不想1.调用外部命令curl,2.重定向到文件..谢谢。 - Jacquelyn.Marquardt
1
为什么你可以直接发起 HTTP 请求,而不是使用 curl(依赖于系统)并将其保存在 JSON 文件中? - EuberDeveloper

5

运行命令./ngrok http &,将ngrok隧道作为后台进程运行。由于我们使用的是nohup命令,因此通常会打开一个显示分配的URL的窗口,但这不可见。

因此,运行curl http://127.0.0.1:4040/api/tunnels查看由ngrok分配的URL。


4
如果有帮助的话,我写了一个快速脚本来提取在Node中生成的随机URL:
它假设你只对安全的URL感兴趣。
const fetch = require('node-fetch')
fetch('http://localhost:4040/api/tunnels')
  .then(res => res.json())
  .then(json => json.tunnels.find(tunnel => tunnel.proto === 'https'))
  .then(secureTunnel => console.log(secureTunnel.public_url))
  .catch(err => {
    if (err.code === 'ECONNREFUSED') {
      return console.error("Looks like you're not running ngrok.")
    }
    console.error(err)
  })

如果您想要所有的隧道:
const fetch = require('node-fetch')
fetch('http://localhost:4040/api/tunnels')
  .then(res => res.json())
  .then(json => json.tunnels.map(tunnel => tunnel.public_url))
  .then(publicUrls => publicUrls.forEach(url => console.log(url)))
  .catch(err => {
    if (err.code === 'ECONNREFUSED') {
      return console.error(
        "Looks like you're not running ngrok."
      )
    }
    console.error(err)
  })

4

3

1
这样URL就不能被程序和脚本使用了。如果有些程序需要访问ngrok URL,或者您需要网页自动更新正确的链接,该怎么办? - Chupo_cro
1
ngrok还提供API来检查端点我在这里描述了它:https://dev59.com/VVsX5IYBdhLWcg3wB7r3#74403327 - Mykyta

3
import json
import requests


def get_ngrok_url():
    url = "http://localhost:4040/api/tunnels/"
    res = requests.get(url)
    res_unicode = res.content.decode("utf-8")
    res_json = json.loads(res_unicode)
    for i in res_json["tunnels"]:
        if i['name'] == 'command_line':
            return i['public_url']
            break

这是对JUN_NETWORKS Python 3代码的编辑。它仅输出HTTPS URL。我发现Ngrok有时会随机更改URL的显示顺序,有时输出HTTP。额外的循环将始终查找名为“command_line”的“tunnel”,这是HTTPS URL。


2

在Python3中

import json
import requests


def get_ngrok_url():
    url = "http://localhost:4040/api/tunnels"
    res = requests.get(url)
    res_unicode = res.content.decode("utf-8")
    res_json = json.loads(res_unicode)
    return res_json["tunnels"][0]["public_url"]

这个返回的JSON有两个URL,一个是http,另一个是https。 如果你只想要https URL,你可以使用res_json["tunnels"][index num]["proto"]


2
如果您喜欢PowerShell,那么这里有关于变量的内容。
$ngrokOutput = ConvertFrom-Json (Invoke-WebRequest -Uri http://localhost:4040/api/tunnels).Content
$httpsUrl = $ngrokOutput.tunnels.public_url[0]
$httpUrl = $ngrokOutput.tunnels.public_url[1]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接