ussh: bug dans l'analyse des arguments

This commit is contained in:
Jephté Clain 2016-02-02 11:36:42 +04:00
parent 9992505504
commit f4537af09f
1 changed files with 72 additions and 29 deletions

99
ussh
View File

@ -194,9 +194,9 @@ function remove_keys() {
eend eend
} }
function __parse_ssh_config() { function __parse_ssh_config_user() {
local host="$1" config="$2" local config="$1"
[ -f "$config" ] || return 1 if [ -f "$config" ]; then
awkrun host="$host" ' awkrun host="$host" '
BEGIN { BEGIN {
in_host = 0 in_host = 0
@ -215,44 +215,37 @@ in_host && tolower($1) == "user" {
print "SSH_USER=\"" $2 "\"" print "SSH_USER=\"" $2 "\""
found_user = 1 found_user = 1
} }
in_host && tolower($1) == "port" {
print "SSH_PORT=\"" $2 "\""
}
END { END {
if (found_user) print "true" if (found_user) print "true"
else print "false" else print "false"
} }
' -- "$config" ' -- "$config"
else
echo "false"
fi
} }
function __update_sshopts_user() {
function __update_sshopts_misc() { # Déterminer le compte utilisateur de connexion et le placer dans la
# Déterminer l'utilisateur et le port de connexion et les placer dans les # variables SSH_USER. Analyser pour cela les arguments qui sont fournis dans
# variables SSH_USER et SSH_PORT, respectivement. Analyser pour cela les # les paramètres 2..@. Ajouter l'option -l $DEFAULT_USER au tableau sshopts
# arguments qui sont fournis dans les paramètres 2..@ # si aucune définition pour l'hôte $1 n'existe dans l'un des fichiers de
# Ajouter l'option -l DEFAULT_USER au tableau sshopts si aucune définition # configuration de ssh et si l'utilisateur n'a pas déjà spécifié un compte
# pour l'hôte $1 n'existe dans l'un des fichiers de configuration de ssh et # utilisateur.
# si l'utilisateur n'a pas déjà spécifié un compte utilisateur.
SSH_USER= SSH_USER=
SSH_PORT=22
# L'utilisateur est peut-être fourni avec l'hôte # L'utilisateur est peut-être fourni avec l'hôte
local user host
splituserhost "$1" user host; shift
if [ -n "$user" ]; then if [ -n "$user" ]; then
SSH_USER="$user" SSH_USER="$user"
return return
fi fi
# Analyser les configuration de ssh # Analyser les configuration de ssh
eval "$(__parse_ssh_config "$1" ~/.ssh/config)" && return eval "$(__parse_ssh_config_user ~/.ssh/config)" && return
eval "$(__parse_ssh_config "$1" /etc/ssh/ssh_config)" && return eval "$(__parse_ssh_config_user /etc/ssh/ssh_config)" && return
# Analyser les arguments # Analyser les arguments
local i=1 local i=1
while [ $i -le $# ]; do while [ $i -le $# ]; do
if [ "${!i}" == -l ]; then if [ "${!i}" == -l ]; then
i=$(($i + 1)) i=$(($i + 1))
SSH_USER="${!i}" SSH_USER="${!i}"
elif [ "${!i}" == -p ]; then
i=$(($i + 1))
SSH_PORT="${!i}"
fi fi
i=$(($i + 1)) i=$(($i + 1))
done done
@ -263,14 +256,59 @@ function __update_sshopts_misc() {
SSH_USER="$DEFAULT_USER" SSH_USER="$DEFAULT_USER"
sshopts=(${DEFAULT_USER:+-l "$DEFAULT_USER"} "${sshopts[@]}") sshopts=(${DEFAULT_USER:+-l "$DEFAULT_USER"} "${sshopts[@]}")
} }
function __parse_ssh_config_port() {
local config="$1"
if [ -f "$config" ]; then
awkrun host="$host" '
BEGIN {
in_host = 0
found_port = 0
}
!found_port && tolower($1) == "host" {
in_host = 0
for (i = 2; i <= NF; i++) {
if ($i == host) {
in_host = 1
break
}
}
}
in_host && tolower($1) == "port" {
print "SSH_PORT=\"" $2 "\""
found_port = 1
}
END {
if (found_port) print "true"
else print "false"
}
' -- "$config"
else
echo "false"
fi
}
function __update_sshopts_port() {
# Déterminer le port de connexion et le placer dans la variable SSH_PORT.
# Analyser pour cela les arguments qui sont fournis dans les paramètres 2..@
SSH_PORT=22
# Analyser les configuration de ssh
eval "$(__parse_ssh_config_port ~/.ssh/config)" && return
eval "$(__parse_ssh_config_port /etc/ssh/ssh_config)" && return
# Analyser les arguments
local i=1
while [ $i -le $# ]; do
if [ "${!i}" == -p ]; then
i=$(($i + 1))
SSH_PORT="${!i}"
fi
i=$(($i + 1))
done
}
function __update_sshopts_cm() { function __update_sshopts_cm() {
# Rajouter le cas échéant les options pour le multiplexage des connexions au # Rajouter le cas échéant les options pour le multiplexage des connexions au
# tableau sshopts, pour l'hôte $1 # tableau sshopts, pour l'hôte $1
# SSH_USER doit être défini # SSH_USER doit être défini
local user host
local found cmhost cmkey tmphost shared control persist local found cmhost cmkey tmphost shared control persist
local -a hosts local -a hosts
splituserhost "$1" user host
for cmhost in "${CMHOSTS[@]}"; do for cmhost in "${CMHOSTS[@]}"; do
[ -n "$cmhost" ] || continue [ -n "$cmhost" ] || continue
cmkey="$cmhost"; cmkey="${cmkey//./_}"; cmkey="${cmkey//-/_}" cmkey="$cmhost"; cmkey="${cmkey//./_}"; cmkey="${cmkey//-/_}"
@ -319,6 +357,13 @@ function __update_sshopts_cm() {
fi fi
[ -n "$persist" ] && sshopts=("${sshopts[@]}" -o ControlPersist="$persist") [ -n "$persist" ] && sshopts=("${sshopts[@]}" -o ControlPersist="$persist")
} }
function __update_sshopts() {
local user host
splituserhost "$1" user host; shift
__update_sshopts_user "$@"
__update_sshopts_port "$@"
__update_sshopts_cm
}
function show_vars() { function show_vars() {
local -a sshopts local -a sshopts
@ -329,8 +374,7 @@ function show_vars() {
set_array_cmd args @ "$@" set_array_cmd args @ "$@"
for host in "${hosts[@]}"; do for host in "${hosts[@]}"; do
array_copy sshopts SSHOPTS array_copy sshopts SSHOPTS
__update_sshopts_misc "$host" "$@" __update_sshopts "$host" "$@"
__update_sshopts_cm "$host"
set_var_cmd host "$host" set_var_cmd host "$host"
set_array_cmd options sshopts set_array_cmd options sshopts
done done
@ -349,8 +393,7 @@ function do_ssh() {
[ -z "$onehost" ] && etitle "$host" [ -z "$onehost" ] && etitle "$host"
array_copy sshopts SSHOPTS array_copy sshopts SSHOPTS
__update_sshopts_misc "$host" "$@" __update_sshopts "$host" "$@"
__update_sshopts_cm "$host"
${exec:+exec} "$SSH" "${sshopts[@]}" "$host" "$@" || r=$? ${exec:+exec} "$SSH" "${sshopts[@]}" "$host" "$@" || r=$?
[ -z "$onehost" ] && eend [ -z "$onehost" ] && eend