Skip to content

Instantly share code, notes, and snippets.

@codeinthehole
Last active August 6, 2023 22:02
Show Gist options
  • Save codeinthehole/5064150 to your computer and use it in GitHub Desktop.
Save codeinthehole/5064150 to your computer and use it in GitHub Desktop.
Bash helper function for easier port forwarding - should be added to your ~/.bashrc
# Easier port forwarding - usage:
#
# $ portforward project-app1 5432
#
# where 'project-app1' is an alias from ~/.ssh/config and 5432 is the remote
# port that you want to forward to.
function portforward() {
HOST=$1
REMOTE_PORT=$2
# Pick a random port and check it is free
LOCAL_PORT=$((RANDOM+1000))
if ! [[ `lsof -i :$LOCAL_PORT | grep COMMAND` ]]
then
# Port is free - woop!
echo "Forwarding to port $REMOTE_PORT on $HOST from http://localhost:$LOCAL_PORT"
ssh -L $LOCAL_PORT:localhost:$REMOTE_PORT $HOST -N 2> /dev/null
else
# Recursion ftw
portforward $HOST $REMOTE_PORT
fi
}
@codeinthehole
Copy link
Author

Just for info, here's my latest version:

# Easier port forwarding - usage:
#
# $ portforward project-app1 5432 [5588]
#
# where 'project-app1' is an alias from ~/.ssh/config and 5432 is the remote
# port that you want to forward to. An optional local port can be specified to
# - it omitted, then a random available port will be chosen.
function portforward() {
    if [[ $# -le 1 ]]
    then
        echo "Usage: portforward HOST PORT [LOCALPORT]";
        return
    fi
    HOST=$1
    REMOTE_PORT=$2
    if [[ $# -eq 3 ]]
    then
        LOCAL_PORT=$3
    else
        # Pick a random port and check it is free
        LOCAL_PORT=$((RANDOM+1000))
    fi
    if ! [[ `lsof -i :$LOCAL_PORT | grep COMMAND` ]]
    then
        # Port is free - woop!
        echo "Forwarding to port $REMOTE_PORT on $HOST from http://localhost:$LOCAL_PORT"
        ssh -L $LOCAL_PORT:localhost:$REMOTE_PORT $HOST -N 2> /dev/null
        [[ $? -ne 0 ]] && echo "Unable to connect to $HOST"
    else
        # Recursion ftw
        portforward $HOST $REMOTE_PORT
    fi
}

function _portforward() {
    # Only autocomplete on the first arg
    if [[ ${COMP_WORDS[COMP_CWORD-1]} == "portforward" ]]
    then
        # Extract host aliases from ~/.ssh/config
        HOSTS=$(grep --color=never "^Host " ~/.ssh/config | awk '{if ($2 != "*") print $2}')
        CURRENT_WORD="${COMP_WORDS[COMP_CWORD]}"
        COMPREPLY=($(compgen -W "$HOSTS" -- $CURRENT_WORD))
        return 0
    fi
}

complete -F _portforward portforward

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment