ajouter les options --parse, --exec, --no-exec

This commit is contained in:
Jephte CLAIN 2014-06-13 08:22:26 +04:00
parent 167d7195d9
commit 2c060670c4
1 changed files with 62 additions and 34 deletions

96
ussh
View File

@ -10,6 +10,7 @@ USAGE
$scriptname [options] hosts $scriptname [options] hosts
$scriptname [options] @hostsfile $scriptname [options] @hostsfile
$scriptname -r hosts $scriptname -r hosts
$scriptname --parse hosts
OPTIONS OPTIONS
hosts hosts
@ -52,7 +53,19 @@ Les options suivantes sont exclusives à ce script:
Quand cette option est spécifié, l'option -j est reconnue et permet de Quand cette option est spécifié, l'option -j est reconnue et permet de
NE PAS se reconnecter à l'hôte juste après avoir nettoyé les clés. Avec NE PAS se reconnecter à l'hôte juste après avoir nettoyé les clés. Avec
l'option -j, TOUS les arguments sont des noms d'hôte puisqu'aucune l'option -j, TOUS les arguments sont des noms d'hôte puisqu'aucune
connexion n'est effectuée." connexion n'est effectuée.
--exec
--no-exec
Avec --exec, si un seul hôte est spécifié, lancer le processus ssh avec
exec, pour éviter d'encombrer la mémoire. C'est l'option par défaut.
Avec --no-exec, ne jamais utiliser exec pour lancer ssh.
--parse
Afficher la définition des variables ssh, options, hosts et args qui
permettent d'effectuer la connexion à partir d'un autre script. Exemple:
"'eval "$(ussh --parse args...)"
for host in "${hosts[@]}"; do
"$ssh" "${options[@]}" "$host" "${args[@]}"
done'""
} }
__PARSED_HOSTS=() __PARSED_HOSTS=()
@ -91,7 +104,21 @@ function __expand_braces() {
echo "$1" echo "$1"
fi fi
} }
function __dot_is_localhost() { [ "$1" == "." ] && echo "localhost." || echo "$1"; } function __dot_is_localhost() { [ "$1" == "." ] && echo "localhost" || echo "$1"; }
function __fix_domain() {
local user host
splituserhost "$1" user host
if [ "$host" == localhost ]; then
: # ne pas corriger localhost
elif [ "${host%.}" != "$host" ]; then
# si le nom se termine par ., le prendre tel quel
host="${host%.}"
elif ! [[ "$host" == *.* ]]; then
# sinon rajouter le domaine par défaut le cas échéant
host="$host${DOMAIN:+.$DOMAIN}"
fi
echo "${user:+$user@}$host"
}
function fix_hosts() { function fix_hosts() {
# Si hosts contient des éléments multiple, comme a:b, séparer ces # Si hosts contient des éléments multiple, comme a:b, séparer ces
# éléments. i.e (a b:c "d e") --> (a b c d e) # éléments. i.e (a b:c "d e") --> (a b c d e)
@ -114,8 +141,9 @@ function fix_hosts() {
array_addu _hosts "$host" array_addu _hosts "$host"
fi fi
done done
array_map _hosts __dot_is_localhost
array_map _hosts __fix_domain
array_copy hosts _hosts array_copy hosts _hosts
array_map hosts __dot_is_localhost
} }
function remove_key() { function remove_key() {
@ -126,22 +154,12 @@ function remove_keys() {
urequire ipcalc urequire ipcalc
local -a __hosts; array_copy __hosts hosts local -a __hosts; array_copy __hosts hosts
local -a allhosts hosts ips; local host user ip local -a allhosts hosts ips; local host hostname user ip
array_copy allhosts __hosts array_copy allhosts __hosts
etitle "Suppression des entrées dans ~/.ssh/known_hosts" etitle "Suppression des entrées dans ~/.ssh/known_hosts"
for host in "${allhosts[@]}"; do for host in "${allhosts[@]}"; do
splituserhost "$host" user host splituserhost "$host" user host
if [ "$host" == localhost ]; then
: # ne pas corriger localhost
elif [ "${host%.}" != "$host" ]; then
# si le nom se termine par ., le prendre tel quel
host="${host%.}"
elif ! [[ "$host" == *.* ]]; then
# sinon rajouter le domaine par défaut le cas échéant
host="$host${DOMAIN:+.$DOMAIN}"
fi
if ipcalc_checkip "$host" >/dev/null; then if ipcalc_checkip "$host" >/dev/null; then
ip="$host" ip="$host"
remove_key "$ip" remove_key "$ip"
@ -166,25 +184,25 @@ function remove_keys() {
eend eend
} }
function do_ssh() { function show_vars() {
local r set_var_cmd ssh "$SSH"
[ -n "$SSH" ] || SSH=ssh set_array_cmd options SSHOPTS
[ "${#hosts[*]}" -gt 1 ] && showtitle=1 || showtitle= set_array_cmd hosts
for host in "${hosts[@]}"; do set_array_cmd args @ "$@"
splituserhost "$host" user host }
if [ "$host" == localhost ]; then
: # ne pas corriger localhost
elif [ "${host%.}" != "$host" ]; then
# si le nom se termine par ., le prendre tel quel
host="${host%.}"
elif ! [[ "$host" == *.* ]]; then
# sinon rajouter le domaine par défaut le cas échéant
host="$host${DOMAIN:+.$DOMAIN}"
fi
[ -n "$showtitle" ] && etitle "${user:+$user@}$host" function do_ssh() {
"$SSH" "${SSHOPTS[@]}" "${user:+$user@}$host" "$@" || r=$? local onehost r
[ -n "$showtitle" ] && eend if [ "${#hosts[*]}" -gt 1 ]; then
onehost=
exec=
else
onehost=1
fi
for host in "${hosts[@]}"; do
[ -z "$onehost" ] && etitle "$host"
${exec:+exec} "$SSH" "${SSHOPTS[@]}" "$host" "$@" || r=$?
[ -z "$onehost" ] && eend
done done
return "${r:-0}" return "${r:-0}"
} }
@ -197,6 +215,8 @@ DOMAIN="$USSH_DOMAIN"
SSH= SSH=
remove= remove=
remove_only= remove_only=
exec=1
parse=
parse_opts "${PRETTYOPTS[@]}" \ parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \ --help '$exit_with display_help' \
-1,-2,-4,-6,-A,-a,-C,-f,-g,-K,-k,-M,-N,-n,-q,-s,-T,-t,-V,-v,-X,-x,-Y,-y '$sshopt "$option_"' \ -1,-2,-4,-6,-A,-a,-C,-f,-g,-K,-k,-M,-N,-n,-q,-s,-T,-t,-V,-v,-X,-x,-Y,-y '$sshopt "$option_"' \
@ -207,8 +227,11 @@ parse_opts "${PRETTYOPTS[@]}" \
--port: '$sshopt -p "$value_"' \ --port: '$sshopt -p "$value_"' \
-d:,--domain: DOMAIN= \ -d:,--domain: DOMAIN= \
-z:,--ssh: SSH= \ -z:,--ssh: SSH= \
-r,--remove remove=1 \ -r,--remove '$remove=1; parse=' \
-j remove_only=1 \ -j remove_only=1 \
--exec exec=1 \
--no-exec exec= \
--parse '$parse=1; remove=' \
@ args -- "$@" && set -- "${args[@]}" || die "$args" @ args -- "$@" && set -- "${args[@]}" || die "$args"
if [ -n "$remove" ]; then if [ -n "$remove" ]; then
@ -228,4 +251,9 @@ else
fix_hosts fix_hosts
fi fi
do_ssh "$@" [ -n "$SSH" ] || SSH=ssh
if [ -n "$parse" ]; then
show_vars "$@"
else
do_ssh "$@"
fi