diff --git a/ussh b/ussh index d6f2884..0079fc3 100755 --- a/ussh +++ b/ussh @@ -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