mirror of
https://github.com/gburd/nix-config.git
synced 2024-09-09 11:26:12 +00:00
53 lines
1.4 KiB
Bash
53 lines
1.4 KiB
Bash
![]() |
#!/usr/bin/env bash
|
||
|
# Exposes a port through SSH
|
||
|
# xpo [local port] [remote host] [remote port]
|
||
|
#
|
||
|
# Arguments:
|
||
|
# - local port: defaults to 8080
|
||
|
# - remote host: defaults to $XPO_SERVER
|
||
|
# - remote port: defaults to randomly chosen
|
||
|
#
|
||
|
# Environment variables:
|
||
|
# - $XPO_SERVER: server to ssh into
|
||
|
# - $XPO_SSH_USER: override user used to ssh, defaults to $USER
|
||
|
# - $XPO_SSH_OPTS: additional ssh options, defaults to "-A"
|
||
|
|
||
|
socket="${XDG_RUNTIME_DIR:-/run/user/${UID:-1000}}/xpo-$BASHPID.sock"
|
||
|
server="${2:-$XPO_SERVER}"
|
||
|
user="${XPO_SSH_USER:-$USER}"
|
||
|
l_port="${1:-8080}"
|
||
|
ssh_opts="${XPO_SSH_OPTS:-"-A"}"
|
||
|
|
||
|
# Open master ssh connection
|
||
|
ssh -fTN "$ssh_opts" -MS "$socket" "$user@$server"
|
||
|
|
||
|
echo "Forwarding :$l_port" >&2
|
||
|
|
||
|
# If port was supplied
|
||
|
if [ -n "${3:-}" ]; then
|
||
|
r_port="$3"
|
||
|
ssh -S "$socket" -O forward -R "*:$r_port:localhost:$l_port" xpo
|
||
|
else
|
||
|
# Forward port and record it
|
||
|
r_port="$(ssh -S "$socket" -O forward -R "*:0:localhost:$l_port" xpo)"
|
||
|
fi
|
||
|
|
||
|
echo "$server:$r_port"
|
||
|
|
||
|
# Open it through iptables
|
||
|
echo -n "Opening $r_port on firewall... " >&2
|
||
|
ssh "$ssh_opts" -t -S "$socket" xpo -- sudo iptables -I INPUT -p tcp --dport "$r_port" -j ACCEPT
|
||
|
echo "done" >&2
|
||
|
|
||
|
clean() {
|
||
|
# Close it
|
||
|
echo "Closing $r_port on firewall... " >&2
|
||
|
ssh "$ssh_opts" -t -S "$socket" xpo -- sudo iptables -D INPUT -p tcp --dport "$r_port" -j ACCEPT
|
||
|
echo "done" >&2
|
||
|
# Close the ssh connection
|
||
|
ssh -S "$socket" -O exit xpo
|
||
|
}
|
||
|
trap clean EXIT
|
||
|
|
||
|
sleep infinity
|