IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Vos scripts shell


Sujet :

Shell et commandes GNU

  1. #121
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 127
    Points : 126
    Points
    126
    Par défaut Ma Konsole prend des couleurs
    Type de script : Fonctions Bash, Bin Bash, (un peu comme Bond, James Bond)
    Compatible: Bash on va dire
    Prérequis: à mettre dans un fichier shebangué et à sourcer

    Rien de stupéfiant, juste un peu de couleurs dans la Konsole quand un script raconte quelque chose:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
     
    # renvoie le code couleur correspondant à une couleur en toutes lettres
    get_color (){
     
    OPTIND=1
    while getopts :r:i: opt; do
      case $opt in
        r)	# regular color, foreground de 30 à 37 - background de 40 à 47
          case "$OPTARG" in
    	black|noir)	test "$f" = true && return 30 ; test "$b" = true && return 40 ;;
    	red|rouge)	test "$f" = true && return 31 ; test "$b" = true && return 41 ;;
    	green|vert)	test "$f" = true && return 32 ; test "$b" = true && return 42 ;;
    	yellow|jaune)	test "$f" = true && return 33 ; test "$b" = true && return 43 ;;
    	blue|bleu)	test "$f" = true && return 34 ; test "$b" = true && return 44 ;;
    	purple|violet)	test "$f" = true && return 35 ; test "$b" = true && return 45 ;;
    	cyan)		test "$f" = true && return 36 ; test "$b" = true && return 46 ;;
    	white|blanc)	test "$f" = true && return 37 ; test "$b" = true && return 47 ;;
    	*) echo "cas non géré get_color: $OPTARG ? f:$f ? b:$b ?" >&2	;;
          esac
        ;;
        i)	# highintensivity color (bof), foreground de 90 à 97 - background de 100 à 107
        #~ echo "get_color opt: $opt" >&2
          case "$OPTARG" in
    	black|noir)	test "$F" = true && return 90 ; test "$B" = true && return 100 ;;
    	red|rouge)	test "$F" = true && return 91 ; test "$B" = true && return 101 ;;
    	green|vert)	test "$F" = true && return 92 ; test "$B" = true && return 102 ;;
    	yellow|jaune)	test "$F" = true && return 93 ; test "$B" = true && return 103 ;;
    	blue|bleu)	test "$F" = true && return 94 ; test "$B" = true && return 104 ;;
    	purple|violet)	test "$F" = true && return 95 ; test "$B" = true && return 105 ;;
    	cyan)		test "$F" = true && return 96 ; test "$B" = true && return 106 ;;
    	white|blanc)	test "$F" = true && return 97 ; test "$B" = true && return 107 ;;
    	*) echo "cas non géré get_color: $OPTARG ? f:$f ? b:$b ?" >&2
          ;;
          esac
        ;;
        *)	echo "cas '$opt' non géré par get_color" >&2
        ;;
      esac
    done
    shift $((OPTIND - 1))
     
    return 0
     
    }
     
    printc (){
     
     deb='\e[' ; fin='\e[m' ; colsize=	; coltamp= ; k= ; args= ; strc=
     OPTIND=1
     while getopts :c:f:b:F:B:hn opt; do
    		case $opt in
    			c)
    				ansi_code="$OPTARG"
    			;;
    			f|F)
    				if [ "$opt" == "f" ]; then
    					f=true ; fc="$OPTARG"
    				else
    					F=true ; Fc="$OPTARG"
    				fi
    			;;
    			b|B)
    				if [ "$opt" == "b" ]; then	b=true ; bc="$OPTARG";	else	B=true ; Bc="$OPTARG";	fi
    			;;
    			h)
    				echo "printc [-c code_ansi] [f|F nom_couleur] [b|B nom_couleur] [--col INT] CHAÎNE" >&2
    				return 1
    			;;	# --help
    			n)	n=true	;;	# sans retour à la ligne
    			*)	# gestion des options longues, j'ai besoin de par exemple --col pour définir une longueur de colonne
    				k="$(eval echo \$$OPTIND)" 
    				case "$k" in
    					--col)	# la largeur de la colonne en nombre de caractère
    						# echo "shift 1, args:'$@'" >&2
    						colsize=$(eval echo  \$$((OPTIND+1)))	# suppose que le paramètre de l'option longue ne soit pas accolé
    						args="$@" ; args="${args#*$colsize }"	# cherche les paramètres restants après le traitement de '--col val' 
    						# double [[ ou génère des erreurs car $args contient des choses style '--' ça passe pas du tout en simple [
    						while [[ "$args" != "$@" ]]; do
    						#	echo "while avant shift: /$@/" >&2
    						shift; done	# shift tout ce qui se trouve avant , y compris '--col val' car
    #echo "en sortie de while shift: /$@/" >&2
    						# géré par getopts options courtes et les options+val précédant '--col val' sont toujours présentes dans $@
    						# va sortir, suppose qu'on passe --col en dernière option avant la chaîne à imprimer.
    					;;
    					-) continue ;;
    					*)
     
    						echo "cas '$opt' non géré dans printc, try printc -h how-to" >&2
    					;;
    				esac
    			;;
        esac
      done
     
    		if [[ $colsize = +([0-9]) ]]; then
    			# la chaîne est l'ensemble des arguments restants "$@"
    			coltamp="$@" ; tampsize="${#coltamp}"
     
    			dif=$(($colsize - $tampsize))
    			case "$dif" in
    				[1-9]*)		while [ "$dif" -gt 0 ]; do coltamp+=" " ; ((dif--)); done	;;
    				-[1-9]*)	while [ "$dif" -lt 0 ]; do coltamp="${coltamp:1} " ; ((dif++)); done	;;
    				*) coltamp=""	;;
    			esac
    		else
    			shift $((OPTIND - 1))	# revient à shifter 2 pour sortir de boucle (l'opt traitée + son argument) si plus rien après
    			# ça merde cette ligne à mon avis, ça devrait pas se trouver là, mais c'est lié à la gestion par getopts (???)
    			coltamp="$@"
    		fi
     
     
    	#	echo -e "sortie de getopts, args:'$args', \$$@:/$@/, colsize:$colsize" >&2
     
     
      # Initialise la ligne avec les codes ansi : 0 1 2 3 4 5 7 pour normal bold atténué italic souligné clignotant reverse-v
      strc="$ansi_code"
      for c in f b F B; do
    			case "$c" in
    				f)
    					test "$f" = true || continue	# ne s'arrête pas si pas de foreground regular
    					if [ -z "$strc" ]; then strc="$(get_color -r "$fc" ; echo $?)"
    					else	strc+=";$(get_color -r "$fc" ; echo $?)"
    					fi ; F=false; f=false # foreground color (regular) traitée
    				;;
    				F)
    					test "$F" = true || continue # ne s'arrête pas si pas de foreground highintensivity
    					if [ -z "$strc" ]; then strc="$(get_color -i "$Fc" ; echo $?)"
    					else	strc+=";$(get_color -i "$Fc" ; echo $?)"
    					fi ; F=false; f=false # foreground color (highintensivity) traitée
    				;;
    				b)
    					test "$b" = true || continue	# idem pour les backgrounds regular ou intensivity
    					if [ -z "$strc" ]; then strc="$(get_color -r "$bc" ; echo $?)"
    					else	strc+=";$(get_color -r "$bc" ; echo $?)"
    					fi ; B=false; b=false # background color (regular) traitée
    				;;
    				B)
    					test "$B" = true || continue
    					if [ -z "$strc" ]; then strc="$(get_color -i "$Bc" ; echo $?)"
    					else	strc+=";$(get_color -i "$Bc" ; echo $?)"
    					fi ; B=false; b=false # background color (regular) traitée
    				;;
    			esac
      done
     
     
      if [ -z "$strc" ]; then
    			strc="${coltamp}"
    		else
    			strc="$deb${strc}m${coltamp}$fin"
    		fi
    	# echo "strc retour: '$strc'"
      if test "$n" = true; then	echo -ne "$strc" ; else	echo -e "$strc"; fi
     
    		# set +x
    		# important ces unset, car ex: ansi_code présent dans appel 1 + absent dans appel 2 -> present dans appel 2 sans !
      unset c f b F B h n colsize coltamp k args dif tampsize strc ansi_code
      return 0
     
    }
    Je vous prie de m'excuser je ne mets pas en forme et je ne relis pas, pas le temps (les commentaires sont sans garantie ), pour l'instant ça fonctionne mais je n'utilise pas tout (je sais que peut-être suivant les options ça cafouille) pour l'usage que j'en fais, exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ source lib/common.sh
    $ maxline=62 ; printc -c'1;3' -fwhite -bblue "Qui qu'à vu la clef ???"
    Qui qu'à vu la clef ???
    Ah oui, pourquoi coltamp (?) ... parce que je voulais aligné la sortie des prompt+réponse sur 2 belles colonnes.
    J'avais rajouté une option longue mais obligé de la mettre en dernière position des options sinon ça bug (trop compliqué faudrait que je vois un vrai code avec option longues et courtes gérées peu importe l'ordre et la syntaxe [ =, pas =, collé, espacé de -o, --longopt etc ]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # renvoie la position du curseur dans le terminal au moment de l'appel:
    # https://stackoverflow.com/questions/61552574/shell-script-capturing-cursor-terminal-position-on-mac- ...
    # ... produces-extra-characters
    # https://askubuntu.com/questions/366103/saving-more-corsor-positions-with-tput-in-bash-terminal
    get_termposition () {
    	export $1
    	exec < /dev/tty
    	oldstty=$(stty -g)
    	stty raw -echo min 0
    	printf "\033[6n" > /dev/tty
    	IFS=';' read -r -d R -a pos
    	stty $oldstty
    	eval "$1[0]=$((${pos[0]:2} - 2))"
    	eval "$1[1]=$((${pos[1]} - 1))"
     
    	unset oldstty 
    }
    Bout de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    lineno=0
    printc -nc'1;3' --col $maxline "Qui qu'à vu les clefs ?:  "
    get_termposition there
    ... ça déroule, quand ça écrit une ligne, ça ((lineno++) ...
    ... une erreur ? r=false, définitif mais continue
    # à la fin
    tput sc	# la position acutelle du curseur dans le terminal
    		# se place là où le statut était attendu
    		tput cup $(( ${there[0]} - $lineno )) ${there[1]}
    		test "$r" = true && printc -c1 -fjaune "OK" || printr "Failed"
    		tput rc	# revient à la position de fin de traitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/bash
    source lib/common.sh
    lineno=0 ; r=false ; maxline=62
    printc -nc'1;3' --col $maxline "Qui qu'à vu les clefs ?:  "
    get_termposition there
    for ki in tata mamy tonton toto titi etc; do
    	test "$lineno" = 0 && echo
    	echo -n "$ki ..."
    	test "$ki" = toto && { echo "yes mouah" ; r=true ; break ;} || echo "pas mouah"
    	((lineno++))
    done
    tput sc	# la position acutelle du curseur dans le terminal
    tput cup $(( ${there[0]} - $lineno - 1)) ${there[1]}
    test "$r" = true && printc -c1 -fjaune "Ouf ... $ki ... tu me sauves la life" || printc -c1 -fred "Heu ... Ki qui connaît un serrurier ?" # [edit: ou printr qui fait ces options d'office, ...]
    tput rc	# revient à la position de fin de traitement
    unset there
    (c'est un peu à ajuster le tput cup, suivant le contexte ça peut être $lineno-1 qui tombe juste ...)
    Sauf imprévu, ça fonctionne pas mal. Pour moi c'est de l'exploration, tout ça demande à être optimisé, si tant est que ça sert à quelque chose
    ps: c'est quoi la balise $ dans l'interface ci-dessus ? pour du style ? (je cherchais la palette de couleur à appliquer dans le message ...

  2. #122
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Nom du script : net.translate
    Compatible avec : Bash
    Descriptif : google translate depuis la ligne de commande.
    Dépendances :
    1. lynx
    2. jq

    Pourquoi lynx au lieu de curl: tout ce qui est user-agent, redirections, cookies, sessions etc.
    J'ai essayé avec curl j'ai eu un 400.
    Donc je suis passé à lynx --dump.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #!/bin/bash
     
    # 10:32:01 ~ -1- $ net.translate "j'ai pas envie de me prendre la tête avec unicode"
    # "I don't want to bother with unicode."
    # 10:32:23 ~ -1- $
     
     
    while (( $# ))
    do
        case "$1" in
    	-f|--from)
    	    from="$2"
    	    shift 2
    	    ;;
    	-t|--to)
    	    to="$2"
    	    shift 2	    
    	    ;;
    	*)
    	    translate="$1"
    	    shift
    	    ;;
        esac
    done
     
    url="http://translate.googleapis.com/translate_a/single?client=gtx&sl=$from&tl=$to&dt=t&q=$translate"
    lynx "$url" --dump | jq .[0][0][0] -M

  3. #123
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ help getopts                                                                                                                                                                                                    
    getopts: getopts chaineopts nom [arg ...]                                                                                                                                                                                                      
        Analyse les options en arguments.
    tout comme awk, sed... le filtre jq est mieux entre apostrophes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ curl -s 'http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=fr&dt=t&q=ceaselessly' | jq -r '.[0][0][0]'                                                                                     
    sans cesse
    $
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #124
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    J'ai utilisé à la fois getopt et getopts à un certain moment,
    puis je me suis apperçu que je pouvais m'en tirer sans,
    donc je ne les utilise plus car je ne vois pas la VA du truc.

    Pour curl,
    je pense que j'ai eu un 400 à cause de l'URL malformée,
    particulièrement pour ce qui concerne la variable q
    (le texte à traduire)
    qui contient espaces,
    accents,
    et tout autre caractère qui devrait être url-encodé.

    Je ne sais pas s'il y a un truc qui fait ça sous bash ?

    Et merci pour l'astuce pour retirer les guillemets de jq !

  5. #125
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    getopt gère les options longues (tout seul).
    getopt (qui est une commande externe) et getopts (qui, elle, est bien une primitive (builtin) de bash) gère les shift, il n'y en a qu'un à faire (shift $((--OPTIND))), une fois que toutes les options ont été parsées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ v='one way to do it'
    $ wget -qO- 'http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=fr&dt=t&q='"$(V=( $v ); IFS="+"; echo "${V[*]}")" | jq -r '.[0][0][0]'
    une façon de le faire
    $
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #126
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    Merci N_Bah !
    ça réduis encore les dépendances et je pense que wget est beaucoup plus léger que lynx.
    sympa que wget gère l'encodage,
    je n'ai pas eu à utiliser les "+"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ wget -O- -q 'http://translate.googleapis.com/translate_a/single?client=gtx&sl=fr&tl=en&dt=t&q=allez, à plus tard!' | jq -r '.[0][0][0]'
    Come on, see you later!
    $
    Mais je n'ai pas réussi avec curl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $ curl  'http://translate.googleapis.com/translate_a/single?client=gtx&sl=fr&tl=en&dt=t&q=allez, à plus tard!'
    <!DOCTYPE html>
    <html lang=en>
      <meta charset=utf-8>
      <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
      <title>Error 400 (Bad Request)!!1</title>
      <style>
        *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
      </style>
      <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
      <p><b>400.</b> <ins>That’s an error.</ins>
      <p>Your client has issued a malformed or illegal request.  <ins>That’s all we know.</ins>
    $

  7. #127
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2003
    Messages : 302
    Points : 316
    Points
    316
    Par défaut
    ok, avec curl il faut utiliser --data-urlencode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [...]
    url="http://translate.googleapis.com/translate_a/single?client=gtx&sl=$from&tl=$to&dt=t"
    curl -s "$url" --data-urlencode "q=$translate" | jq -r ".[0][0][0]" -M

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ net.translate "ça marche ça?" --from fr --to en
    does that work?
    $

  8. #128
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    Nom du script: TesteRéseau


    Compatible avec: Bash


    Descriptif: permet de tester une connexion à l'Internet, même dans une entreprise dotée de sous-réseaux. Bien sûr, il faut remplacer les adresses IP par celles qui correspondent au réseau à tester.


    Pré-requis: aucun


    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #!/bin/bash
     
     
    #**** Teste le réseau à différents niveaux ****
     
     
    function teste
    {
        ligne=`ping -c1 $1 2>/dev/null` #** $1 est l'adresse testée (1er argument de la ligne d'appel à teste) **
        if [[ $ligne =~ .*icmp_seq.* ]] #** si 'icmp_seq' est dans le résultat, alors ping a répondu & on affiche le message $2, sinon, il y a erreur & affichage de $3 **
        then
            echo -e "\e[32m$2 \e[0m"
        else
            echo -e "\e[31mERREUR : $3 \e[0m"
        fi
    }
     
    #** appel de la fonction teste avec différentes adresses & les messages (ça baigne ou ça coince) correspondants **
    teste "192.168.0.254" "La passerelle est accessible" "LA CARTE RÉSEAU SEMBLE MAL CONFIGURÉE"
    teste "192.168.0.1" "Le DNS est accessible" "Le DNS est inaccessible"
    teste "10.0.120.46" "Le routage est bon avec le reste du réseau" "Pas de routage entre les réseaux de l'entreprise"
    teste "212.27.48.10" "L'Internet est accessible" "L'Internet est inaccessible"
    teste "www.free.fr" "Le DNS répond correctement" "Le DNS est en panne"
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  9. #129
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/bin/bash
     
     #**** Teste le réseau à différents niveaux ****
     
    declare -i c=4
    adresses=( '192.168.0.254' ... )
    succes=( 'La passerelle est accessible' ... )
    echecs=( 'LA CARTE RÉSEAU SEMBLE MAL CONFIGURÉE' ... )
     
    for i in ${!adresses[*]}
    do
        if ping -c $c "${adresses[i]}" &>/dev/null
        then
            echo "${succes[i]}"
        else
            echo "${echecs[i]}"
        fi
    done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #130
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    Certes, c'est plus court, mais...
    Cela répond-il au besoin d'un diagnostic complet ?
    Voir un message d'erreur standard à chaque étape ne permet pas nécessairement de savoir ce qui coince.
    Car il s'agit de diagnostiquer un réseau complexe, avec passerelles, routeurs...
    Donc, un message différencié est souhaitable.

    Maintenant, ta façon de contrôler la liaison me semble très courte, donc meilleure que la mienne. À retenir.
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  11. #131
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Je ne vois pas trop la différence de traquer le fait que ping sort en erreur (méthode N_BaH) pour afficher le message d'erreur selon l'ip que l'on ping et la tienne qui cherche une séquence de caractère...

    De plus, il serait bien aussi de pouvoir définir des options différentes selon l'ip que l'on souhaite diagnostiquer car par exemple je peux très bien avoir pour un dommaine donnée de l'ipv6 et de l'ipv4 et il serait bien de savoir si seulement l'un des 2 est ko ou pas.
    Cordialement.

  12. #132
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    À disedorgue : Comme je l'écrivais, la méthode de N_BaH est sûrement plus efficace que la mienne, bien que le résultat soit identique.
    Quant à pouvoir tester des IP V6, je suppose qu'il suffit d'ajouter des appels à teste avec de telles adresses.
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

  13. #133
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Désolé, je n'avais pas lu ta dernière ligne

    Pour l'autre remaque, si on passe par son petit nom dns, on peut avoir une reconnaissance ipv4 et ipv6:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ ping -6 -c1 www.googl.com
    PING www.googl.com(par21s20-in-x03.1e100.net (2a00:1450:4007:818::2003)) 56 data bytes
    64 bytes from par21s20-in-x03.1e100.net (2a00:1450:4007:818::2003): icmp_seq=1 ttl=111 time=9.12 ms
     
    --- www.googl.com ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 9.122/9.122/9.122/0.000 ms
    $ ping -4 -c1 www.googl.com
    PING  (216.58.213.67) 56(84) bytes of data.
    64 bytes from lhr25s01-in-f67.1e100.net (216.58.213.67): icmp_seq=1 ttl=120 time=12.1 ms
     
    ---  ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 12.115/12.115/12.115/0.000 ms
    Cordialement.

  14. #134
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par ALT Voir le message
    À disedorgue : Comme je l'écrivais, la méthode de N_BaH est sûrement plus efficace que la mienne, bien que le résultat soit identique.
    Il n'y a pas que le résultat qui compte mais aussi le temps mis à l'obtenir. Dans ton code tu récupères le ping pour évaluer textuellement la chaine qui en résulte (ce qui est ultra-long)... alors qu'un simple test ping réussi ou pas suffit
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function teste (
        if ping -c1 $1 1>/dev/null 2>&1
        then
            echo -e "\e[32m$1 - $2 \e[0m"
        else
            echo -e "\e[31mERREUR : $1 - $3 \e[0m"
        fi
    )
    C'est je pense ce que voulait montrer N_Bah. D'autant plus que ton code initial ne fonctionne pas dans un réseau avec firewall dans lequel ping 192.168.0.254 retourne la chaine "From xxx.xxx.xxx.xxx icmp_seq=1 Packet filtered". Bien que le ping échoue, il y a la chaine "icmp_seq" qui fait croire à ton code qu'il a réussi.

    En revanche je préfère ton principe (tester individuellement chaque ip) à celui de N_Bah (où on doit créer le tableau d'ip d'un côté, le tableau des réussites de l'autre et celui des échecs dans un 3°).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  15. #135
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 287
    Points : 12 744
    Points
    12 744
    Par défaut
    Et que dire de ce résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     ping -c1 192.168.1.134
    PING 192.168.1.134 (192.168.1.134) 56(84) bytes of data.
    From 192.168.1.135 icmp_seq=1 Destination Host Unreachable
     
    --- 192.168.1.134 ping statistics ---
    1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
    Cordialement.

  16. #136
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Il n'y a pas que le résultat qui compte mais aussi le temps mis à l'obtenir. Dans ton code tu récupères le ping pour évaluer textuellement la chaine qui en résulte (ce qui est ultra-long)... alors qu'un simple test ping réussi ou pas suffit
    Ai-je dit le contraire ?
    Note néanmoins qu'on ne lance pas un test réseau très souvent. Donc, le temps d'exécution reste marginal, même si, sur le principe, je suis d'accord avec toi.

    PRÉCISION : ceci était la reprise d'un script qui fonctionnait avec une Debian précédente (il y a plus de 10 ans), mais plus avec l'actuelle. D'où ma bidouille pour l'adapter. Je sais qu'elle n'est pas optimale & je me doutais qu'elle comportait une faille, révélée par disedorgue & Sve@r.
    Mon test initial était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ping -c1 $1 2>/dev/null
    ... Et ça ne fonctionnait plus quand je l'ai essayé ces derniers jours (le résultat était toujours le succès).

    La proposition de Sve@r fonctionne parfaitement.
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

Discussions similaires

  1. Script shell
    Par anzar dans le forum Linux
    Réponses: 4
    Dernier message: 03/12/2004, 14h41
  2. [JSP] script shell
    Par goolix dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 06/08/2004, 09h08
  3. Exécution d'un script shell
    Par Manu0086 dans le forum Linux
    Réponses: 8
    Dernier message: 15/06/2004, 16h31
  4. Explication script shell
    Par crasho007 dans le forum Linux
    Réponses: 2
    Dernier message: 14/06/2004, 13h54
  5. Cron + terminal + script shell
    Par nicolas.pissard dans le forum Linux
    Réponses: 3
    Dernier message: 17/03/2004, 09h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo