···11+#!/usr/bin/env bash
22+set -euo pipefail
33+44+# Default SSH port
55+SSH_PORT="${SSH_PORT:-22}"
66+77+# Create temporary directory for this tor instance
88+TOR_DIR=$(mktemp -d -t tor-ssh-service.XXXXXX)
99+trap 'rm -rf "$TOR_DIR"' EXIT
1010+1111+# Generate random ports
1212+SOCKS_PORT=$((9050 + RANDOM % 1000))
1313+CONTROL_PORT=$((SOCKS_PORT + 1))
1414+1515+# Create hidden service directory with proper permissions
1616+mkdir -p "$TOR_DIR/hidden_service"
1717+chmod 700 "$TOR_DIR/hidden_service"
1818+1919+# Create tor configuration
2020+cat > "$TOR_DIR/torrc" <<EOF
2121+DataDirectory $TOR_DIR/data
2222+SocksPort 127.0.0.1:$SOCKS_PORT
2323+ControlPort 127.0.0.1:$CONTROL_PORT
2424+Log notice file $TOR_DIR/tor.log
2525+RunAsDaemon 0
2626+2727+# Hidden service configuration
2828+HiddenServiceDir $TOR_DIR/hidden_service
2929+HiddenServicePort 22 127.0.0.1:$SSH_PORT
3030+3131+# Performance and reliability optimizations
3232+CircuitBuildTimeout 15
3333+LearnCircuitBuildTimeout 0
3434+NumEntryGuards 8
3535+KeepalivePeriod 60
3636+SocksTimeout 120
3737+3838+# Reliability settings
3939+MaxCircuitDirtiness 600
4040+NewCircuitPeriod 30
4141+UseEntryGuards 1
4242+EOF
4343+4444+echo "Starting Tor hidden service for SSH..."
4545+echo "SSH port: $SSH_PORT"
4646+echo "SOCKS port: $SOCKS_PORT"
4747+echo ""
4848+4949+# Start tor in background
5050+tor -f "$TOR_DIR/torrc" &
5151+TOR_PID=$!
5252+5353+# Function to cleanup tor process
5454+cleanup() {
5555+ if kill -0 "$TOR_PID" 2>/dev/null; then
5656+ kill "$TOR_PID" 2>/dev/null || true
5757+ wait "$TOR_PID" 2>/dev/null || true
5858+ fi
5959+ rm -rf "$TOR_DIR"
6060+}
6161+trap cleanup EXIT INT TERM
6262+6363+# Wait for tor to bootstrap
6464+echo "Waiting for Tor to bootstrap..."
6565+for i in {1..300}; do
6666+ if grep -q "Bootstrapped 100%" "$TOR_DIR/tor.log" 2>/dev/null; then
6767+ echo "Tor bootstrapped successfully!"
6868+ break
6969+ fi
7070+ if [ "$i" -eq 300 ]; then
7171+ echo "Error: Tor failed to bootstrap"
7272+ exit 1
7373+ fi
7474+ sleep 0.5
7575+done
7676+7777+# Wait for hidden service to be created
7878+echo "Waiting for hidden service..."
7979+for i in {1..60}; do
8080+ if [ -f "$TOR_DIR/hidden_service/hostname" ]; then
8181+ break
8282+ fi
8383+ if [ "$i" -eq 60 ]; then
8484+ echo "Error: Hidden service hostname not created"
8585+ exit 1
8686+ fi
8787+ sleep 1
8888+done
8989+9090+# Display the onion address
9191+ONION_ADDRESS=$(cat "$TOR_DIR/hidden_service/hostname")
9292+echo ""
9393+echo "==============================================="
9494+echo "Tor SSH hidden service is running!"
9595+echo ""
9696+echo "Onion address: $ONION_ADDRESS"
9797+echo ""
9898+9999+# Generate QR code for easy copying
100100+echo "QR Code for the onion address:"
101101+qrencode -t UTF8 "$ONION_ADDRESS"
102102+echo ""
103103+104104+echo "To connect from another machine:"
105105+echo " torify ssh $ONION_ADDRESS"
106106+echo ""
107107+echo "Or with a specific user:"
108108+echo " torify ssh user@$ONION_ADDRESS"
109109+echo ""
110110+echo "Press Ctrl+C to stop the service"
111111+echo "==============================================="
112112+echo ""
113113+114114+# Keep the service running
115115+while true; do
116116+ if ! kill -0 "$TOR_PID" 2>/dev/null; then
117117+ echo "Tor process died unexpectedly"
118118+ exit 1
119119+ fi
120120+ sleep 5
121121+done