theniceboy/bin/ncon
2025-08-12 11:41:21 -07:00

72 lines
No EOL
2.1 KiB
Python
Executable file

#!/usr/bin/env python3
import json
import subprocess
import sys
import os
import getpass
def get_tunnels():
try:
result = subprocess.run(['ngrok', 'api', 'tunnels', 'list'],
capture_output=True, text=True, check=True)
tunnels = json.loads(result.stdout)
return tunnels['tunnels']
except Exception as e:
print(f"Error getting tunnels: {e}")
return []
def get_ssh_tunnel():
tunnels = get_tunnels()
for tunnel in tunnels:
if tunnel['proto'] == 'tcp' and tunnel['forwards_to'] == 'localhost:22':
url = tunnel['public_url']
host_port = url.replace('tcp://', '')
host, port = host_port.rsplit(':', 1)
return host, port
print("No SSH tunnel found")
return None, None
def list_tunnels():
tunnels = get_tunnels()
if not tunnels:
print("No tunnels found")
return
for tunnel in tunnels:
url = tunnel['public_url']
forwards_to = tunnel['forwards_to']
if tunnel['proto'] == 'tcp':
host_port = url.replace('tcp://', '')
host, port = host_port.rsplit(':', 1)
local_port = forwards_to.split(':')[-1]
print(f"{host}:{port} -> localhost:{local_port}")
else:
domain = url.replace('https://', '').replace('http://', '')
local_port = forwards_to.split(':')[-1]
ngrok_port = "443" if url.startswith('https://') else "80"
print(f"{domain}:{ngrok_port} -> localhost:{local_port}")
def main():
if len(sys.argv) < 2:
print("Usage: ncon [ssh|list]")
sys.exit(1)
if sys.argv[1] == 'ssh':
host, port = get_ssh_tunnel()
if host and port:
cmd = ['ssh', '-p', port, f'david@{host}']
print(f"Connecting to: {' '.join(cmd)}")
os.execvp('ssh', cmd)
else:
print("Failed to find SSH tunnel")
sys.exit(1)
elif sys.argv[1] == 'list':
list_tunnels()
else:
print("Unknown command. Use: ncon [ssh|list]")
sys.exit(1)
if __name__ == '__main__':
main()