108 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | |
| source "$(dirname -- "$0")/lib/ulib/auto" || exit 1
 | |
| urequire ipcalc
 | |
| 
 | |
| if [ $# -eq 1 -a "$1" == "--help" ]; then
 | |
|     exit_with uecho "$scriptname: Faire une connexion ssh en utilisant l'exécutable approprié au réseau source et destination
 | |
| 
 | |
| USAGE
 | |
|     $scriptname [user@]host"
 | |
| fi
 | |
| 
 | |
| # fonctions de support
 | |
| function match_network() {
 | |
|     local ip="$1" network="$2"
 | |
|     local -a includes excludes domains
 | |
|     local spec
 | |
|     array_copy includes "${network}_INCLUDES"
 | |
|     array_copy excludes "${network}_EXCLUDES"
 | |
|     array_copy domains "${network}_DOMAINS"
 | |
| 
 | |
|     if ipcalc_checkip "$ip" >/dev/null; then
 | |
|         for spec in "${excludes[@]}"; do
 | |
|             if ipcalc_match "$ip" "$spec"; then
 | |
|                 return 1
 | |
|             fi
 | |
|         done
 | |
|         for spec in "${includes[@]}"; do
 | |
|             if ipcalc_match "$ip" "$spec"; then
 | |
|                 return 0
 | |
|             fi
 | |
|         done
 | |
|     else
 | |
|         for spec in "${domains[@]}"; do
 | |
|             [[ "$ip" == *."$spec" ]] && return 0
 | |
|         done
 | |
|     fi
 | |
|     return 1
 | |
| }
 | |
| 
 | |
| # paramètres de l'environnement
 | |
| DO=
 | |
| if [ "$1" == --debug ]; then
 | |
|     # Activer le mode DEBUG
 | |
|     shift
 | |
|     set_verbosity -D
 | |
| elif [ "$1" == --trace ]; then
 | |
|     # Activer le mode DEBUG
 | |
|     shift
 | |
|     set_verbosity -D
 | |
|     TRACE=1
 | |
|     DO=qvals
 | |
| fi
 | |
| 
 | |
| NETWORKS=()
 | |
| RULES=()
 | |
| set_defaults mssh
 | |
| 
 | |
| # déterminer d'où l'on vient
 | |
| from=
 | |
| array_from_lines myips "$(ip addr | awk '$1 == "inet" { gsub(/\/.*/, "", $2); print $2 }')"
 | |
| for network in "${NETWORKS[@]}"; do
 | |
|     for myip in "${myips[@]}"; do
 | |
|         if match_network "$myip" "$network"; then
 | |
|             from="$network"
 | |
|             break
 | |
|         fi
 | |
|     done
 | |
|     [ -n "$from" ] && break
 | |
| done
 | |
| edebug "FROM: ${from:-ANY} (${myips[*]})"
 | |
| 
 | |
| # analyser la ligne de commande
 | |
| vars="$("$scriptdir/ussh" --parse "$@")" || exit 1
 | |
| 
 | |
| [ -n "$TRACE" ] && echo "$vars"
 | |
| eval "$vars"
 | |
| 
 | |
| for userhost in "${hosts[@]}"; do
 | |
|     # déterminer où l'on veut aller
 | |
|     splituserhost "$userhost" user host
 | |
| 
 | |
|     to=
 | |
|     for network in "${NETWORKS[@]}"; do
 | |
|         if match_network "$host" "$network"; then
 | |
|             to="$network"
 | |
|             break
 | |
|         fi
 | |
|     done
 | |
|     edebug "TO: ${to:-ANY} ($host)"
 | |
| 
 | |
|     # Sélectionner la commande ssh à utiliser
 | |
|     found=
 | |
|     for rule in "${RULES[@]}"; do
 | |
|         splitfsep "$rule" : rfrom rule2
 | |
|         splitfsep "$rule2" : rto rssh
 | |
|         if [ \( -z "$rfrom" -o "$from" == "$rfrom" \) -a \
 | |
|              \( -z "$rto"   -o "$to" == "$rto" \) ]; then
 | |
|             found=1
 | |
|             $DO ${exec:+exec} "$rssh" "${options[@]}" "$userhost" "${args[@]}"
 | |
|             break
 | |
|         fi
 | |
|     done
 | |
|     if [ -z "$found" ]; then
 | |
|         $DO ${exec:+exec} "$ssh" "${options[@]}" "$userhost" "${args[@]}"
 | |
|     fi
 | |
| done
 |