Compare commits

..

No commits in common. "6a905e39cfcd20510d5757e25eb6bb63ab90358a" and "9bf24ee5d1f2831300b08cba71c7fa7d2e977632" have entirely different histories.

View file

@ -1,73 +1,68 @@
#!/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
# Alias si le terminal est kitty
if [ "$TERM" = xterm-kitty ]; then
ssh=(kitty +kitten ssh)
else
step "Stopping the redirection"
stop_forwarding
ssh=(ssh)
fi
# Variables
declare -a args
# Foncitons
error() {
>&2 printf '\033[1;31m%s\033[0m \033[1m%s\033[0m\n' ERROR: "$*"
}
help() {
local name
name="$(basename "$0")"
cat << EOF
${name}: utilisation:
${name} SERVEUR PORT_LOCAL PORT_DISTANT [CIBLE] [-- ARGUMENTS_SSH...]
EOF
}
error_help() {
error "Invalid usage"
>&2 help
exit 1
}
requested_port_bridge_pid() {
lsof -nP -i TCP -s TCP:LISTEN | awk '($1 == "ssh" && $9 ~ /.*:'"${1}"'/) { print $2 }' | uniq | head -n 1
}
# Analyser les arguments
while [ -n "$1" ]; do
case "$1" in
--)
shift
break
;;
*)
args+=("$1")
shift
;;
esac
done
# Il doit y avoir au moins 3 arguments dans le tableau
if [ "${#args[@]}" -lt 3 ]; then
error_help
fi
pid="$(requested_port_bridge_pid "${args[1]}")"
if [ -z "$pid" ]; then
exec "${ssh[@]}" \
-f \
-N \
-L "${args[1]}:${args[3]:-localhost}:${args[2]}" \
"${args[0]}" \
"$@"
else
echo "Suppression de la redirection..."
kill "$pid"
fi