#!/usr/bin/env bash # Start the HTTP-to-SOCKS5h bridge in the background. # # listens: http://127.0.0.1:18080 # upstream: socks5h://127.0.0.1:12026 (SSH -D, remote DNS) # # Tools that only understand HTTP proxies can now do: # HTTP_PROXY=http://127.0.0.1:18080 HTTPS_PROXY=http://127.0.0.1:18080 ... # # Env overrides: BIND PORT UPSTREAM (see http2socks.py) # # ./http2socks.sh # start (idempotent -- won't double-start) # ./http2socks.sh stop # kill running instance # ./http2socks.sh status # show running pid + egress IP via the bridge # ./http2socks.sh logs # tail the log set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PY="$HERE/.venv/bin/python" LOG="${LOG:-$HERE/.http2socks.log}" PIDFILE="$HERE/.http2socks.pid" BIND="${BIND:-127.0.0.1}" PORT="${PORT:-18080}" is_running() { [[ -f "$PIDFILE" ]] && kill -0 "$(cat "$PIDFILE" 2>/dev/null)" 2>/dev/null } cmd_start() { if is_running; then echo "already running (pid $(cat "$PIDFILE")) on http://$BIND:$PORT" return 0 fi nohup "$PY" "$HERE/http2socks.py" --bind "$BIND" --port "$PORT" >"$LOG" 2>&1 & echo $! > "$PIDFILE" sleep 0.6 if is_running; then echo "started (pid $(cat "$PIDFILE")) on http://$BIND:$PORT -> socks5h://127.0.0.1:12026" echo "log: $LOG" else echo "failed to start; log:" >&2 tail -n 20 "$LOG" >&2 || true rm -f "$PIDFILE" exit 1 fi } cmd_stop() { if is_running; then pid="$(cat "$PIDFILE")" kill "$pid" 2>/dev/null || true sleep 0.5 kill -9 "$pid" 2>/dev/null || true echo "stopped (pid $pid)" else echo "not running" fi rm -f "$PIDFILE" } cmd_status() { if is_running; then pid="$(cat "$PIDFILE")" echo "running (pid $pid) on http://$BIND:$PORT -> socks5h://127.0.0.1:12026" echo "egress via bridge:" http_proxy="http://$BIND:$PORT" https_proxy="http://$BIND:$PORT" \ curl -s --max-time 15 https://api.ipify.org && echo || echo "(curl failed)" else echo "not running" fi } cmd_logs() { tail -n "${1:-50}" -f "$LOG" } case "${1:-start}" in start) cmd_start ;; stop) cmd_stop ;; status) cmd_status ;; logs) shift; cmd_logs "$@" ;; *) echo "usage: $0 [start|stop|status|logs]" >&2; exit 2 ;; esac