如何在后台运行ngrok?

36

我尝试使用以下命令在后台运行ngrok:

./ngrok -subdomain test -config=ngrok.cfg 80 &

进程正在运行:

[1] 3866

子域名无法工作。

它可以使用:

./ngrok -subdomain test -config=ngrok.cfg 80

有人知道这里出了什么问题吗?

谢谢。

22个回答

44

如前所述,您可以在后台运行ngrok。

./ngrok http 8080 > /dev/null &

接下来,您可以使用curl和例如jq命令行JSON处理工具。

export WEBHOOK_URL="$(curl http://localhost:4040/api/tunnels | jq ".tunnels[0].public_url")"

您的URL将从$WEBHOOK_URL环境变量中访问,并且您可以在任何地方使用它。


1
这绝对是以编程方式访问它的最佳解决方案! - the1dv
1
你检查了吗? - Tebe
5
我建议使用curl --silent(或 curl -s)和 jq -r 来减少输出信息。因此,在双引号内键入以下内容:$(curl -s http://localhost:4040/api/tunnels | jq -r '.tunnels[0].public_url')。(如果需要,请将此内容放入答案中;现在作为注释留下。) - lindes
如果您有多个隧道,则这不是确定性的。一个简单的解决方法是通过仅使用HTTPS来强制使用一个隧道:ngrok http --bind-tls=true --log=stdout 8080 > /dev/null & - Juliusz Gonera
jq: error: Could not open file .tunnels[0].public_url: No such file or directory - alper

41

如此所述 在这里

ngrok -log=stdout 80 > /dev/null &

2
不适用于ngrok2。有关新版本的任何想法? - IvanD
@toas939 哦,谢谢你!有太多的答案,但都不正确。 - Kirby
1
@AndyFaizan 很不幸,这需要额外的费用。我忘记我们公司为此支付了多少钱,但我记得不是很多。 - dave4jr
好的。我问是因为我已经有一个付费账户,但它仍然无法工作。不管怎样,还是谢谢。 - AndyFaizan
从2.0.24版本开始,ngrok http 80 --log=stdout > ngrok.log & 就可以解决问题了。 - rlib
显示剩余4条评论

19

简单易懂: ngrok http 80 --log=stdout > ngrok.log & 转化了技巧。


4
“nohup ngrok http 80 --log=stdout > ngrok.log &” 这个命令似乎更安全,以防 SSH 连接断开。 - alper

16

1
或者在ngrok网站上注册一个免费账户,将您的本地安装连接到它上面-然后您就可以在线查看您的活动隧道。 - Tim Malone

13

这是我写的一个小bash脚本,它在后台运行ngrok。然后,它尝试通过调用一个curl命令(针对http://127.0.0.1:4040/api/tunnels)和一个sed命令(提取ngrok公共URL),来设置NGROK_PUBLIC_URL变量。这一切都在一个循环内运行,直到NGROK_PUBLIC_URL具有有效值,因为通常需要2或3秒钟才能建立ngrok隧道。

start-ngrok.sh

#!/bin/sh

# Set local port from command line arg or default to 8080
LOCAL_PORT=${1-8080}

echo "Start ngrok in background on port [ $LOCAL_PORT ]"
nohup ngrok http ${LOCAL_PORT} &>/dev/null &

echo -n "Extracting ngrok public url ."
NGROK_PUBLIC_URL=""
while [ -z "$NGROK_PUBLIC_URL" ]; do
  # Run 'curl' against ngrok API and extract public (using 'sed' command)
  export NGROK_PUBLIC_URL=$(curl --silent --max-time 10 --connect-timeout 5 \
                            --show-error http://127.0.0.1:4040/api/tunnels | \
                            sed -nE 's/.*public_url":"https:..([^"]*).*/\1/p')
  sleep 1
  echo -n "."
done

echo
echo "NGROK_PUBLIC_URL => [ $NGROK_PUBLIC_URL ]"
脚本将端口作为可选的命令行参数,例如。
$ . start-ngrok.sh 1234

Run NGROK in background on port [ 1234 ]
Extracting ngrok public url ...
NGROK_PUBLIC_URL => [ 75d5faad.ngrok.io ]

...但如果没有提供端口,则会在端口8080上运行...

$ . start-ngrok.sh 

Run NGROK in background on port [ 8080 ]
Extracting ngrok public url ...
NGROK_PUBLIC_URL => [ 07e7a373.ngrok.io ]

NGROK_PUBLIC_URL 现在包含公共网址,即

$ echo $NGROK_PUBLIC_URL
07e7a373.ngrok.io

这可以在你的应用程序中被访问/使用。

注意: 这个脚本需要被起源引入(. start-ngrok.shsource start-ngrok.sh)。这是因为它正在设置一个环境变量,如果在新的shell中正常运行(即./start-ngrok.sh),该变量将不可用。有关更多信息,请参见https://superuser.com/q/176783

你还可以创建一个小脚本,使用pkill/kill等来停止后台的ngrok进程: -

stop-ngrok.sh

#!/bin/sh

echo "Stopping background ngrok process"
kill -9 $(ps -ef | grep 'ngrok' | grep -v 'grep' | awk '{print $2}')
echo "ngrok stopped"

但是这仍然无法在后台运行。当我关闭终端时,它就会停止运行。 - Poonam
在我的电脑上不行 - 这就是 nohup(无挂起)命令的作用 - nohup ngrok http ${LOCAL_PORT} &>/dev/null & - 更多详情请参见 https://en.wikipedia.org/wiki/Nohup。 - bobmarksie
要终止该进程,您可以发出简单的命令:kill -9 "$(pgrep ngrok)" - Bogdan Stoica
非常好,我以前从未使用过 pgrep,谢谢分享! - bobmarksie

11
在Ngrok 2中,-log既不是必需的,也不可用(尽管您可以在配置文件中控制日志级别)。ngrok > /dev/null &足够使用。

4
我该如何获得访问我的服务所需的URL? - Oliv
如果你想这样做,你必须在前台运行它(据我所知)。后台运行主要用于作为服务运行时,你很可能知道自己的领域。 - Chandler Swift
3
看我的回答,有一个方法。 - Oliv
还有 Artem 的答案,https://dev59.com/tV4d5IYBdhLWcg3wG_aH#48841928(我留言稍微修改了一下)。 - lindes
@Oliv:检查URL最简单的方法是登录Ngrok网页并使用仪表板。 - Chupo_cro

9
如果您想从单个SSH会话中使用多个shell窗口或在后台运行任何服务,最简单的方法是使用screen
要在Centos Linux上安装,请使用yum install screen命令。
然后像其他命令一样启动screen,之后输入带参数的ngrok命令。
分离是screen最强大的部分。Screen允许您从窗口分离并稍后重新连接。
如果您的网络连接失败,screen将自动分离您的会话! 您可以使用“Ctrl-a” “D”从窗口分离。
这将使您回到您的shell。
所有screen窗口仍然存在,您可以使用screen -r稍后重新连接它们。

如果你不能在没有链接的情况下使用你的答案,那么通常认为这是一个糟糕的答案。 - martijnn2008

7

6
运行./ngrok http 5000 > /dev/null &,然后使用curl localhost:4040/status检查URL。

2
需要更正,使用 nohup ./ngrok http 5000 > /dev/null & 命令。这样当我们关闭终端时,进程不会被杀死。 - Aakash Kag
但是这仍然无法在后台运行。 - Poonam
@Poonam 抱歉我没有在我的答案中提到它。但请像上面的评论所说的那样,查看nohup建议。 - Old Panda

6

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

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


之前更新过,但现在不再起作用。无法连接到本地主机的4040端口:连接被拒绝。 请参考https://dev59.com/tV4d5IYBdhLWcg3wG_aH#48841928答案。 - Stanislau Buzunko
但是这仍然不能在后台运行。当我关闭终端时它会停止运行。 - Poonam

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