Просмотр случайного URL-адреса ngrok при работе в фоновом режиме

Когда я запускаю клиент ngrok с ./ngrok tcp 22, он запускается на переднем плане, и я могу видеть сгенерированный случайным образом URL-адрес пересылки, например tcp://0.tcp.ngrok.io:12345 -> localhost:22.

Если я запустил фон с ./ngrok tcp &, я не смогу найти способ увидеть URL пересылки. Как я могу запустить ngrok в фоновом режиме и по-прежнему видеть URL-адрес?


person Julia Ebert    schedule 16.12.2015    source источник


Ответы (14)


Есть несколько способов.

Вы также можете:

1) Посетите localhost:4040/status в своем браузере, чтобы увидеть кучу информации, или

2) Используйте curl, чтобы попасть в API: localhost:4040/api/tunnels

person Abe Petrillo    schedule 23.12.2015

Этот небольшой скрипт Python (2.7) вызовет API ngrok и распечатает текущий 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)
person Gerard    schedule 03.01.2016
comment
как я могу сделать это с python3 только с urllib.urlopen? Я не хочу 1. вызывать внешнюю команду curl, 2. перенаправлять в файл .. Спасибо - person Jacquelyn.Marquardt; 27.08.2017
comment
Почему вы должны использовать curl (зависит от системы) и сохранять его в файле json, в то время как вы можете просто сделать http-запрос? - person EuberDeveloper; 17.03.2021

Если вы хотите получить первый туннель, то jq будет вашим другом:

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

При запуске более одного экземпляра ngrok используйте имя туннеля /api/tunnels/:name.

person avalanchy    schedule 09.09.2019
comment
В zsh по какой-то причине мне приходилось ставить перед '[' и ']' префикс '\', поэтому здесь мне пришлось запустить curl -s localhost:4040/api/tunnels | jq -r .tunnels\[0\].public_url. Но работает отлично, спасибо! - person Henrique Bruno; 10.12.2020
comment
@HenriqueBruno для переносимости можно использовать двойные кавычки: curl -s localhost:4040/api/tunnels | jq -r ".tunnels[0].public_url" - person François Leblanc; 30.04.2021
comment
Правда! Не думал об этом. Спасибо! - person Henrique Bruno; 30.04.2021
comment
@ François Leblanc Спасибо! - person Elon; 11.05.2021

Если это кому-то поможет, я написал быстрый скрипт для извлечения сгенерированного случайного URL-адреса в 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)
  })
person James Broad    schedule 05.10.2017

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. Он выводит только URL-адрес HTTPS. Я обнаружил, что Ngrok случайным образом меняет порядок, в котором URL отображается первым, иногда выводя HTTP. Дополнительный цикл будет последовательно искать «туннель» с именем «command_line», который является URL-адресом HTTPS.

person Rex Tess    schedule 08.01.2019

В 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-URL, вы res_json["tunnels"][index num]["proto"]

person JUN_NETWORKS    schedule 22.11.2018

Если вам нравится 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]
person Johnny    schedule 11.06.2020

Запустите ./ngrok http & Это запустит туннель ngrok в фоновом режиме. Ngrok обычно открывает окно с назначенным URL-адресом, но, поскольку мы используем команду nohup, его не видно.

Таким образом, затем запустите curl http://127.0.0.1:4040/api/tunnels, чтобы увидеть URL-адрес, присвоенный ngrok

person Hemanth Kondapalli    schedule 24.01.2018

В 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
person Cruz Nunez    schedule 28.11.2018

Решение для Node.js.

Бонус: он копирует URL-адрес в буфер обмена в Windows, Mac и Linux 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
person Abhijit    schedule 02.01.2021

Если вы используете 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)
}
person Alex Cory    schedule 17.02.2021
comment
используйте const tunnels = await api.listTunnels (); вместо api.get, поскольку он устарел - person Shalabyer; 25.06.2021

Самый простой способ проверить сгенерированный случайным образом URL - перейти на официальный сайт ngrok ›панель управления› конечные точки ›статус и проверьте URL-адреса и статус моих конечных точек

person not cat    schedule 04.05.2021
comment
Таким образом, URL-адрес не может использоваться с программами и сценариями. Что делать, если какой-то программе требуется доступ к URL-адресу ngrok или вам нужно, чтобы веб-страница автоматически обновлялась с правильной ссылкой? - person Chupo_cro; 21.05.2021

Может быть, я немного запоздал с ответом, но был бы рад, если бы это было полезно для всех, кто посещает вопрос.

*** Вышеуказанные ответы - это решения для просмотра / проверки URL-адреса перенаправления. Однако для запуска ngrok в фоновом режиме вы можете попробовать использовать screen в Linux. Если вам нужна помощь, воспользуйтесь кратким справочником.

Шаги: 1. Просто запустите ngrok на экране, а затем отсоедините его. 2. Используйте скрипт python, данный Джерардом выше, чтобы увидеть URL.

Я следовал тому же процессу, и он работает!

person mohanjot    schedule 08.08.2017

Есть лучший способ сделать это, просто войдите в свою учетную запись на ngrok.com. Ваш URL будет на вашей панели управления.

person Jirawat Kusolpredee    schedule 18.01.2019