Compare commits
No commits in common. "6a905e39cfcd20510d5757e25eb6bb63ab90358a" and "9bf24ee5d1f2831300b08cba71c7fa7d2e977632" have entirely different histories.
6a905e39cf
...
9bf24ee5d1
1 changed files with 64 additions and 69 deletions
133
bin/ssh-fwd
133
bin/ssh-fwd
|
@ -1,73 +1,68 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
step() {
|
# Alias si le terminal est kitty
|
||||||
printf '\033[1;32m*\033[0m \033[1m%s...\033[0m\n' "$*"
|
if [ "$TERM" = xterm-kitty ]; then
|
||||||
}
|
ssh=(kitty +kitten ssh)
|
||||||
|
|
||||||
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
|
else
|
||||||
step "Stopping the redirection"
|
ssh=(ssh)
|
||||||
stop_forwarding
|
|
||||||
fi
|
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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue