-
-
Save rjz/af40158c529d7c407420fc0de490758b to your computer and use it in GitHub Desktop.
#!/bin/sh | |
# ngrok's web interface is HTML, but configuration is bootstrapped as a JSON | |
# string. We can hack out the forwarded hostname by extracting the next | |
# `*.ngrok.io` string from the JSON | |
# | |
# Brittle as all get out--YMMV. If you're still reading, usage is: | |
# | |
# $ ./ngrok_hostname.sh <proto> <addr> | |
# | |
# To retrieve the ngrok'd URL of an HTTP service running locally on :3332, use: | |
# | |
# $ ./ngrok_hostname.sh http localhost:3332 | |
# | |
# The protocol (http, https, etc) of the forwarded service | |
PROTO=$1 | |
# The address of the forwarded service | |
ADDR=$2 | |
# Hack JSON out of the web interface bootstrap | |
json=$(curl -s localhost:4040/inspect/http \ | |
| grep -oP 'window.common[^;]+' \ | |
| sed 's/^[^\(]*("//' \ | |
| sed 's/")\s*$//' \ | |
| sed 's/\\"/"/g') | |
# Parse JSON for the URLs matching the configured `$ADDR` | |
hosts=$(echo $json \ | |
| jq -r ".Session.Tunnels \ | |
| values \ | |
| map(select(.Config.addr == \"$ADDR\") | .URL) | .[]") | |
echo "$hosts" | grep "^${PROTO}:" |
seems not working anymore:
% curl --silent --show-error http://127.0.0.1:4040/api/tunnels
curl: (52) Empty reply from server
% curl -v http://localhost:4040/inspect/http
* Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 4040 (#0)
> GET /inspect/http HTTP/1.1
> Host: localhost:4040
> User-Agent: curl/7.64.1
> Accept: */*
>
* Empty reply from server
* Connection #0 to host localhost left intact
curl: (52) Empty reply from server
* Closing connection 0
Which version of ngrok?
Which version of ngrok?
should be latest one, just tried one hour ago
should be latest one, just tried one hour ago
Just tried with the latest stable, it is working as usual.
Did you add inspect: true
in your config file? (ngrok.yml
)
no luck.thx anyway
url_new_https = response.json()["tunnels"][0]["public_url"]
Nice, good stuff. Amazing thread here.
Shell script
OSX Sonoma 14.3
ngrok version 3.5.0
local json_data=$(curl -s localhost:4040/api/tunnels)
local public_url=$(echo "$json_data" | python3 -c "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])")
echo $public_url
local json_data=$(curl -s localhost:4040/api/tunnels)
local public_url=$(echo "$json_data" | python3 -c "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])")
echo $public_
local json_data=$(curl -Chikita Isaac bitcoin.comlocalhost:4040/api/tunnels)
local public_url=$(echo "$json_data" | python3 -c "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])")varonis.com
echo $public_freewallet(100000000000000000000000000000000000000000000000000009)
I've created a bash script with the snippets found here, which takes the ngrok hostname and copies it into a spring configuration file (yml).
It verifies also if the ngrok executable is present in the same folder. You can call directly ngrok without checking it's configuration file, but in case that you need it:
Im not a bash scripting expert, it can be improved. The hard part is calling curl after it's launch, as the process is running. Without redirecting it to /dev/null it wouldn't be possible to execute the following commands.
This way ngrok's output is lost, it's kinda sad :/