当我使用./ngrok tcp 22
启动ngrok客户端时,它会在前台运行,并且我可以看到随机生成的转发URL,例如tcp://0.tcp.ngrok.io:12345 -> localhost:22
。
如果我使用./ngrok tcp &
在后台运行,我找不到任何方式来查看转发URL。如何在后台运行ngrok并仍然能够查看URL?
当我使用./ngrok tcp 22
启动ngrok客户端时,它会在前台运行,并且我可以看到随机生成的转发URL,例如tcp://0.tcp.ngrok.io:12345 -> localhost:22
。
如果我使用./ngrok tcp &
在后台运行,我找不到任何方式来查看转发URL。如何在后台运行ngrok并仍然能够查看URL?
有几种方法。
你可以选择:
1) 在浏览器中访问 localhost:4040/status
来查看一些信息,或者
2) 使用curl命令请求API:localhost:4040/api/tunnels
jq
将是你的好朋友:curl -s localhost:4040/api/tunnels | jq -r '.tunnels[0].public_url'
如果运行多个ngrok实例,则使用隧道名称/api/tunnels/:name
。
这个小 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)
运行命令./ngrok http &
,将ngrok隧道作为后台进程运行。由于我们使用的是nohup命令,因此通常会打开一个显示分配的URL的窗口,但这不可见。
因此,运行curl http://127.0.0.1:4040/api/tunnels
查看由ngrok分配的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)
})
curl \
-H "Authorization: Bearer {API_KEY}" \
-H "Ngrok-Version: 2" \
https://api.ngrok.com/endpoints
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。
在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"]
。
$ngrokOutput = ConvertFrom-Json (Invoke-WebRequest -Uri http://localhost:4040/api/tunnels).Content
$httpsUrl = $ngrokOutput.tunnels.public_url[0]
$httpUrl = $ngrokOutput.tunnels.public_url[1]
curl -s localhost:4040/api/tunnels | jq -r .tunnels\[0\].public_url
。但完美地运行了,谢谢! - Henrique Brunocurl -s localhost:4040/api/tunnels | jq -r ".tunnels[0].public_url"
。该命令的作用是获取本地主机的公共URL地址,并使用JSON解析器jq进行格式化输出。 - François Leblanc查找ngrok分配的子域名:
ngrokUrl=$(echo $ngrok_output | sed -nE 's/.public_url":"https:..([^"]).*/\1/p') - Ryan