ssht — temporary tunnels over plain SSH Expose a service listening on localhost:8080 with one of: # HTTPS endpoint .ssht.fyi for an HTTP/1.1 service ssh -T -o ExitOnForwardFailure=yes -R '*:0:localhost:8080' https@ssht.fyi # the same, for a service speaking cleartext HTTP/2 (h2c, gRPC) ssh -T -o ExitOnForwardFailure=yes -R '*:0:localhost:8080' https-h2@ssht.fyi # raw TCP endpoint ssht.fyi: for anything else (ssh, databases) ssh -T -o ExitOnForwardFailure=yes -R '*:0:localhost:8080' tcp@ssht.fyi The user name picks the mode; the port is assigned. Replace localhost:8080 with your service. -T skips a shell, -R '*:0:...' asks for a public port, and ExitOnForwardFailure ends ssh if none is granted. Options go after the host, quoted, as the ssh command: token= get the same address again; each session prints its token auth=user:pass visitors must log in with HTTP basic auth (https modes) allow=203.0.113.0/24 only these sources may connect (comma separated) verbose print one line per visitor request in this session no-http3 serve this endpoint over HTTP/1.1 and HTTP/2 only status-json machine-readable events instead of text e.g. ssh -T -R '*:0:localhost:8080' https@ssht.fyi 'auth=me:s3cret verbose' SSH host key: SHA256:h7z8l5gPEtiVn+E0R74kEoGt/6c0JAf/ROnDKIxWnB4 Endpoints are public and temporary. Keep SSH connected to keep your tunnel open. Per endpoint: 100 visitor connections; 200 active HTTPS requests. Combined upload/download: 100 Mbps sustained; up to 1000 Mbps for 10 seconds. Contact: contact@ssht.fyi Build: b905de7