6a905e39cf
master
73 lines
1.5 KiB
Bash
Executable file
73 lines
1.5 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
step() {
|
|
printf '\033[1;32m*\033[0m \033[1m%s...\033[0m\n' "$*"
|
|
}
|
|
|
|
error() {
|
|
>&2 printf '\033[1;31mERROR:\033[0m \033[1m%s\033[0m\n' "$error"
|
|
return "$1"
|
|
}
|
|
|
|
error_null_arg() {
|
|
local error
|
|
error="Argument \"${arg_name}\" can't be null"
|
|
error 1
|
|
}
|
|
|
|
# Lancer la redirection SSH
|
|
start_forwarding() {
|
|
ssh \
|
|
-f -N \
|
|
-L "${local_port}:${target}:${distant_port}" \
|
|
"$@" \
|
|
"$ssh_host"
|
|
}
|
|
|
|
show_redirection_info() {
|
|
lsof -i -P -n | awk '($1 == "ssh" && $10 == "(LISTEN)" && $9 ~ /.*:'"${local_port}"'/) { print }'
|
|
}
|
|
|
|
get_ssh_pid() {
|
|
show_redirection_info | awk '{ print $2 }' | sort | uniq
|
|
}
|
|
|
|
# Supprimer la redirection SSH
|
|
stop_forwarding() {
|
|
start_forwarding -O cancel
|
|
if [ "$?" -eq 255 ]; then
|
|
echo "Okay then, brutally killing SSH..."
|
|
kill "$(get_ssh_pid)"
|
|
fi
|
|
}
|
|
|
|
# Retourner 0 si le port de la redirection est déjà utilisé par SSH
|
|
is_forwarding_active() {
|
|
[ -n "$(show_redirection_info)" ]
|
|
}
|
|
|
|
# Parser les variables
|
|
trap error_null_arg EXIT
|
|
set -e
|
|
|
|
arg_name='SSH host' ; ssh_host="$1" ; shift
|
|
arg_name='local port' ; local_port="$1" ; shift
|
|
arg_name='distant port'; distant_port="$1"; shift
|
|
trap - EXIT
|
|
unset arg_name
|
|
|
|
if [ -n "$1" ]
|
|
then target="$1"
|
|
else target=localhost
|
|
fi
|
|
|
|
set +e
|
|
|
|
# Branchement principal
|
|
if ! is_forwarding_active; then
|
|
step "Starting the redirection"
|
|
start_forwarding
|
|
else
|
|
step "Stopping the redirection"
|
|
stop_forwarding
|
|
fi
|