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

101
ussh
View File

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