在后台运行时查看随机ngrok URL

时间:2015-12-16 22:05:45

标签: ngrok

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

如果我使用./ngrok tcp &在其中运行背景,我找不到任何方式来查看转发网址。如何在后台运行ngrok并仍然可以看到URL?

14 个答案:

答案 0 :(得分:37)

有两种方法。

你可以:

A)访问localhost:4040/status以查看大量信息

2)使用curl点击API:localhost:4040/api/tunnels

答案 1 :(得分:10)

这个小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)

答案 2 :(得分:2)

如果它帮助我编写快速脚本的任何人在Node中提取生成的随机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)
  })

答案 3 :(得分:2)

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”的“隧道”,即HTTPS URL。

答案 4 :(得分: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]

答案 5 :(得分:0)

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

因此,运行curl http://127.0.0.1:4040/api/tunnels也会看到ngrok分配的URL

答案 6 :(得分:0)

在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具有2个url,分别表示 http https 。 如果只需要 https网址,则res_json["tunnels"][index num]["proto"]

答案 7 :(得分:0)

在Ruby中

require 'httparty'

# get ngrok public url
begin
  response = HTTParty.get 'http://localhost:4040/api/tunnels'
  json = JSON.parse response.body
  new_sms_url = json['tunnels'].first['public_url']
rescue Errno::ECONNREFUSED
  print 'no ngrok instance found. shutting down'
  exit
end

答案 8 :(得分:0)

有一种更好的方法,只需登录ngrok.com上的帐户即可。 您的网址将在您的信息中心中。

答案 9 :(得分:0)

如果您想获得第一个隧道,那么jq将是您的朋友:

curl -s localhost:4040/api/tunnels | jq -r .tunnels[0].public_url

运行多个ngrok实例时,请使用隧道名称/api/tunnels/:name

答案 10 :(得分:0)

Node.js 解决方案。

奖励:它在 Windows、Mac 和 Linux 中将 url 复制到剪贴板1

const http = require("http");
const { execSync } = require("child_process");

const callback = (res) => {
    let data = "";
    res.on("data", (chunk) => (data += chunk));
    res.on("end", () => {
        const resJSON = JSON.parse(data);
        const tunnels = resJSON.tunnels;

        const { public_url: url } = tunnels.find(({ proto }) => proto === "https");

        console.log(url);

        // Copy to clipboard
        switch (process.platform) {
            case "win32":
                execSync(`echo ${url} | clip`);
                break;
            
            case "darwin":
                execSync(`echo ${url} | pbcopy`);
                break;
                
            case "linux":
                // NOTE: this requires xclip to be installed
                execSync(`echo ${url} | xclip -selection clipboard`);
                break;
                
            default:
                break;
        }
    });
};

http.get("http://localhost:4040/api/tunnels", callback);

[1] 您需要先安装 xclip

sudo apt-get install xclip

答案 11 :(得分:0)

如果你使用的是 nodejs,我这样做了

const getURL = async () => {
  // inspect if the callback is working at: http://127.0.0.1:4040/inspect/http 
  const ngrok = await import('ngrok')
  const api = ngrok.getApi();
  const { tunnels } = JSON.parse(await api?.get('api/tunnels') ?? '{}')
  // if we already have a tunnel open, disconnect. We're only allowed to have 4
  if (tunnels?.length > 0) await ngrok.disconnect()
  return await ngrok.connect(3000)
}

答案 12 :(得分:0)

我检查随机生成的 URL 的最简单方法是转到 ngrok official site > dashboard > endpoints > status 并检查我的端点的 URL 和状态

答案 13 :(得分:-1)

可能我回答的时间太晚了,但如果对访问这个问题的人有帮助,我会很高兴。

***以上答案是查看/检查重定向网址的解决方案。但是要在后台运行ngrok,你可以尝试在linux中使用screen。如果你需要帮助,请快速reference

步骤: 1.只需在屏幕中运行ngrok然后分离。 2.使用上面Gerard给出的python脚本来查看URL。

我遵循相同的流程并且有效!