Script (ou plutôt une fonction) de vérification si une chaine est une adresse IP valide

MilesTEG

Administreur
Membre du personnel
6 Septembre 2020
3 050
738
213
Hello 👋
@shaks2022 J'ai pu voir dans un autre sujet que tu semblais bien maitriser la ligne de commande, et les scripts bash.

L'idée c'est d'avoir une fonction qui vérifie que la chaine passée en argument est une adresse IP valide, et retourne une valeur :
1 pour "Oui c'est une adresse IP valide"
0 pour "Non, ce n'est pas une adresse IP, ou pas valide".

Cette fonction est appelée par une autre fonction qui va lancer un test iperf3 sur cette adresse IP.
(oui j'aime bien coder des fonctions ^^)

Avec quelques recherches sur le net j'ai trouvé différents codes pour la fonction function valid_ip(), mais aucun ne fonctionne correctement.

Bash:
function valid_ip()
{
    local  IP=$1
    local  stat=1

    A=`echo "$IP" | awk '/^([0-2][0-5]{1,3}[.]){3}([0-9]{1,3})$/{print $1}'`
    if [ -z $A ]; then
        ## IP is not correct and A is null/zero.
        stat=1
    else
        ## IP address is correct, and returned
        stat=0
    fi
    echo $stat
    return $stat  # Returns $stat
}

function iperf_both_ways()
{
    param_1="$1"    # IP du serveur
    param_2="$2"    # de chaque test

    if [ -z "${param_1}" ]; then
        echo -e "Aucun paramètre indiqué !\n"
        echo -e "\t--> iperf_both_ways < IP > < Durée >\n"
        echo -e "\t\tIP = Adresse IP du serveur iperf3\n"
        echo -e "\t\tDurée (facultatif) = Durée d'un test, en seconde, par défaut = 10s \n"
        return 1
    fi
    # if [ ! valid_ip $param_1 ]; then
    #     echo -e "L'adresse IP entrée n'est pas valide : $param_1\n"
    #     return 1
    # fi
    if [ -z "${param_2}" ]; then
      param_2=20
    fi
    iperf3 -c $param_1 -t $param_2 && iperf3 -c $param_1 -t $param_2 -R
    return 0
}

Précision, il faut que le code fonctionne dans un shell ZSH et aussi en BASH. Les deux fonctions sont mises dans mon fichier .zshrc donc sans shebang au début.

En fait ce qu'il me faudrait (et qui me manque), c'est la méthode pour récupérer via une regex les valeurs entre les points pour vérifier s'ils ne dépassent pas 254.
Car je ne sais pas faire ça en bash alors que je saurais faire en Powershell XD.
L'idéal serait même de ne pas faire appel à d'autre binaires.

Pour savoir si l'allure de la chaine peut être une adresse IP, j'aurais utilisé ça comme regex : ^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$
1676195247753.png
Ça permet d'éliminer tout ce qui n'est pas 4 groupes de 3 chiffres maxi séparés par des points.

Mais comme j'ai dit précédemment, je ne sais pas utiliser le regex dans les scripts bash.


En écrivant ces lignes, j'ai eu une idée, et une petite recherche plus tard, j'ai trouvé comment vérifier si on a bien 4 groupes de max 3 chiffres séparés par des points :
Bash:
#!/bin/bash

# Script test.sh

function valid_ip()
{
    local  IP=$1
    local  stat=1

    if [[ $IP =~ ^([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})$ ]]; then
        ## IP is not correct and A is null/zero.
        stat=1
        msg="$IP is a valid IP !"
    else
        ## IP address is correct, and returned
        stat=0
        msg="$IP is not a valid IP !"
    fi
    echo "$stat : $msg"
    return $stat  # Returns $stat
}

valid_ip $1

result=$?
if [ $result -eq 1 ]; then
   exit 0
elif [ $result -eq 0 ]; then
   exit 1
fi

Me reste encore à trouver comment utiliser les groupes capturés pour en vérifier la valeur.
 
hello @MilesTEG1 .
J'ai déjà eu besoin de coder ça quelque part, mais c'était pas du awk. Le problème avec les calculs d'expression régulieres, c'est que ya plusieurs versions de moteurs de calculs.
Dans tous les cas, voici ce que j'ai:
Code:
 "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
On voit l'évaluation de chaque digit avec plusieurs cas possibles : soit >=200 et <=255 , soit 100 à 199, soit inférieur, et pour avoir 4 digit séparés par 3 points, il y a la répétition avec le "." ( juste avant {3} ) et le dernier digit de droite sans point à sa droite.... :D
mes sources :

Maintenant, j'ai testé ceci
Code:
ifconfig | awk  '$0 ~ "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"'
- sous fedora 37: pas d'erreurs et pas de résultats :(
- sur mon NAS asustor : pas d'erreurs et pas de résultats.

Variante :
Code:
ifconfig | awk  '/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/'
- sous fedora 37: pas d'erreurs et pas de résultats
- sur mon NAS asustor : awk: bad regex, Invalid preceding regular expression

Faut voir chez toi, mais j'ai pas trop d'esporirs... Par contre, une fois l'expression régulière au point, tu peux remplacer "ifconfig" par ton echo $IP, puis exploiter le return code de la commande awk : si pas trouvé, $? = 1, si trouvé, $? = 0....

l'évalutation en bash ne fonctionne pas non plus:
Code:
[root ~]# IP=192.168.1.2
[root ~]# [[ $IP =~ (?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) ]] && echo "OK"

Je vais prendre encore un peu de temps pour gratter , que ça fonctionne au moins sous Fedora.

Ceci a l'air de fonctionner :
Code:
[[ $IP =~ ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) ]] && echo "OK"

un coup avec ? devant, un coup sans... pénibles toutes ces "saveurs" de regexp...
 
Dernière édition:
Quid de coder ça en python et de faire un appel python dans le Bash ? Car en python ça se fait en très peu de lignes, et beaucoup de machines Linux embarquent nativement python.
Si besoin du script vous me faites signe mais il me semble t'avoir déjà vu (miles) parler de git, donc probablement un dev qui sait déjà faire?
S i tu veux absolument du Bash/zsh par contre désolé suis pas assez calé, ça fait parti de mes lacunes à combler...
 
Quid de coder ça en python et de faire un appel python dans le Bash ? Car en python ça se fait en très peu de lignes, et beaucoup de machines Linux embarquent nativement python.
Si besoin du script vous me faites signe mais il me semble t'avoir déjà vu (miles) parler de git, donc probablement un dev qui sait déjà faire?
S i tu veux absolument du Bash/zsh par contre désolé suis pas assez calé, ça fait parti de mes lacunes à combler...
J'ai fini par trouver une version qui fonctionne en bash, à tester en zsh ( pas gagné )... python ne fera que proposer sa propre "saveur" , tout comme bash propose sa saveur,etc... et encore, pas gagné que suivant la version de python, t'ait pas des différences, comme j'ai pu le constater sur l'utilitaire 'awk' qui donne pas le meme résultat sous fedora et sur mon NAS....
 
  • J'aime
Réactions: Nincha
Je préférais rester en bash ou zsh pur !

En tout cas merci , et entre temps j’ai réussi à faire ce que je voulais . Faut juste que ma fille parte faire un dodo pour vous coller le code que j’ai fait. En tout cas ça fonctionne. C’est un peu long en terme de ligne de code mais ça fait le job 😊
Je vous montre ma création tout à l’heure 😊
 
  • J'aime
Réactions: Nincha
Ceci fonctionne mieux, mais un peu laborieux:
Code:
[[ $IP =~ ^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|
[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]] && echo "OK"

Et ceci est de nouveau plus optimisé:
Code:
[[ $IP =~ ^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$ ]]  && echo "OK"
 
Dernière édition:
  • J'aime
Réactions: MilesTEG
Ceci fonctionne mieux, mais un peu laborieux:
Code:
[[ $IP =~ ^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|
[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$ ]] && echo "OK"

Et ceci est de nouveau plus optimisé:
Code:
[[ $IP =~ ^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$ ]]  && echo "OK"
Mon test est plus simple mais Nécessite d’autres tests pour vérifier qu’on n’a pas de 0 en premier groupe ou dernier groupe, et pour vérifier que ça ne dépasse pas 254.
 
Alors, en apparté, l'expression régulière que j'ai publié ci-dessus m'a été fournie par CHATGPT.
Voici la liste des questions posées avant d'arriver au résultat souhaité:
-1/ evaluer qu'une chaine de texte en entrée contient une IP v4 valide, en langage bash ==> résultat pas bon
-2/ On va se concentrer sur l'expression régulière uniquement.. ça ne fonctionne pas, et en plus, je voudrais un controle que les 4 digits des IP sont bien des chiffres entre 0 et 255 ==> résultat OK, mais pas optimisé.
-3/ Est-il possible d'améliorer votre proposition en utilisant par exemple {3} pour ne pas répéter le code pour les 3 1ers digits ( le 4eme digit à droite n'étant pas suivi d'un point, je pense qu'il va falloir conserver sa description ) ? ==> résultat OK, et chatgpt a pris l'initiative de regrouper les 3 derniers digits, au lieu des 3 1ers... ( c'est pareil, mais c'est intéressant de le voir bosser parfois... )

Tout ça pour dire que chatgpt fait gagner un temps précieux, mais il faut maitriser le sujet pour pouvoir vérifier ses réponses, car on ne peut pas lui faire confiance.
 
  • J'aime
Réactions: MilesTEG et jeu2
En gros il te propose une solution, et à toi de contrôler et affiner si nécessaire si je comprends bien.
Intéressant, j'avoue ne pas avoir encore tenté cette IA, mais va bien falloir y passer
 
En gros il te propose une solution, et à toi de contrôler et affiner si nécessaire si je comprends bien.
Intéressant, j'avoue ne pas avoir encore tenté cette IA, mais va bien falloir y passer
c'est là toute sa force : il conserve le contexte de la discussion , et l'interface d'openAI mémorise et indexe tes discussions ... Tu peux commencer à creuser une recette de cuisine , passer au bash dans un nouveau tchat avec l'AI , puis revenir en cuisine ...

@MilesTEG1 : comment tu fais ton contrôle en powershell ?...
EDIT : if ( $IP -match "^... etc.... $" ) ...
 
Dernière édition:
@MilesTEG1 : comment tu fais ton contrôle en powershell ?...
EDIT : if ( $IP -match "^... etc.... $" ) ...
Alors, en Powershell, j'aurais utilisé ça en effet ;)


En Bash, ceci fonctionne :
Bash:
#!/bin/bash

function valid_ip() {
    local IP=$1
    local stat=1
    declare -a digits_groups

    if [[ $IP =~ ^([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})$ ]]; then
        # DIGITS_GROUPS=${BASH_REMATCH[*]}
        # echo ${DIGITS_GROUPS[*]}
        # We know that it's 4 groups of 3 digits !

        # If 1st digits or last equal 0 : not a valid IP
        if [ $((${BASH_REMATCH[1]})) -eq 0 ]; then
            echo "Digits n°1 ( ${BASH_REMATCH[1]} ) = 0 : it's not OK, not a valid IP !"
            stat=0
            return $stat
        elif [ $((${BASH_REMATCH[4]})) -eq 0 ]; then
            echo "Digits n°4 ( ${BASH_REMATCH[4]} ) = 0 : it's not OK, not a valid IP !"
            stat=0
            return $stat
        fi

        for ((i = 1; i <= 4; i++)); do
            # echo "Digits group n°$i = ${BASH_REMATCH[$i]}"
            digits_groups[$i]=${BASH_REMATCH[$i]}
            # digits_groups[$i]=$((${digits_groups[$i]} + 1))
            # echo "Digits group n°$i = ${digits_groups[$i]}"

            if [ $((${digits_groups[$i]})) -gt 254 ]; then
                # digits > 254 : not a valid IP
                echo "Digits ${digits_groups[$i]} >= 255 : it's not OK, not a valid IP !"
                stat=0
                return $stat
            else
                echo "Digits n°$i : ${digits_groups[$i]} <= 254 -> it's OK !"
            fi
        done

        echo $grp1
        stat=1
        msg="$IP is a valid IP !"
    else
        ## IP address is correct, and returned
        stat=0
        msg="$IP is not a valid IP !"
    fi
    echo "$msg"
    return $stat
}

# valid_ip 000.1.2.200

param_1="$1" # IP du serveur
param_2="$2" # de chaque test

if [ -z "${param_1}" ]; then
    echo -e "Aucun paramètre indiqué !\n"
    echo -e "\t--> iperf_both_ways < IP > < Durée >\n"
    echo -e "\t\tIP = Adresse IP du serveur iperf3\n"
    echo -e "\t\tDurée (facultatif) = Durée d'un test, en seconde, par défaut = 10s \n"
    return 1
fi
valid_ip $param_1
result=$?
if [ $result -eq 0 ]; then
    echo -e "L'adresse IP entrée n'est pas valide : $param_1\n"
    exit 1
fi
if [ -z "${param_2}" ]; then
    param_2=20
fi
iperf3 -c $param_1 -t $param_2 && iperf3 -c $param_1 -t $param_2 -R

# result=$?
# if [ $result -eq 1 ]; then
#     exit 1
# elif [ $result -eq 0 ]; then
#     exit 0
# fi

Mais le souci c'est que ça ne passe pas dans le .zshrc si je mets ce qui suit :
Bash:
function valid_ip() {
    local IP=$1
    local stat=1
    declare -a digits_groups

    if [[ $IP =~ ^([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})$ ]]; then
        # DIGITS_GROUPS=${BASH_REMATCH[*]}
        # echo ${DIGITS_GROUPS[*]}
        # We know that it's 4 groups of 3 digits !

        # If 1st digits or last equal 0 : not a valid IP
        if [ $((${BASH_REMATCH[1]})) -eq 0 ]; then
            echo "Digits n°1 ( ${BASH_REMATCH[1]} ) = 0 : it's not OK, not a valid IP !"
            stat=0
            return $stat
        elif [ $((${BASH_REMATCH[4]})) -eq 0 ]; then
            echo "Digits n°4 ( ${BASH_REMATCH[4]} ) = 0 : it's not OK, not a valid IP !"
            stat=0
            return $stat
        fi

        for ((i = 1; i <= 4; i++)); do
            # echo "Digits group n°$i = ${BASH_REMATCH[$i]}"
            digits_groups[$i]=${BASH_REMATCH[$i]}
            # digits_groups[$i]=$((${digits_groups[$i]} + 1))
            # echo "Digits group n°$i = ${digits_groups[$i]}"

            if [ $((${digits_groups[$i]})) -gt 254 ]; then
                # digits > 254 : not a valid IP
                echo "Digits ${digits_groups[$i]} >= 255 : it's not OK, not a valid IP !"
                stat=0
                return $stat
            else
                echo "Digits n°$i : ${digits_groups[$i]} <= 254 -> it's OK !"
            fi
        done

        echo $grp1
        stat=1
        msg="$IP is a valid IP !"
    else
        ## IP address is correct, and returned
        stat=0
        msg="$IP is not a valid IP !"
    fi
    echo "$msg"
    return $stat
}

function iperf_both_ways()
{
    param_1="$1"    # IP du serveur
    param_2="$2"    # de chaque test

    if [ -z "${param_1}" ]; then
        echo -e "Aucun paramètre indiqué !\n"
        echo -e "\t--> iperf_both_ways < IP > < Durée >\n"
        echo -e "\t\tIP = Adresse IP du serveur iperf3\n"
        echo -e "\t\tDurée (facultatif) = Durée d'un test, en seconde, par défaut = 10s \n"
        return 1
    fi
    valid_ip $param_1
    result=$?
    if [ $result -eq 0 ]; then
        echo -e "L'adresse IP entrée n'est pas valide : $param_1\n"
        return 1
    fi
    if [ -z "${param_2}" ]; then
      param_2=20
    fi
    iperf3 -c $param_1 -t $param_2 && iperf3 -c $param_1 -t $param_2 -R
    return 0
}

Faudrait adapter pour ZSH, mais là je sèche...
Ou alors faudrait pouvoir spécifier un équivalent de shebang /bin/bash dans la fonction valid_ip...

Quelqu'un aurait-il une idée de comment adapter pour ZSH ?
 
Alors, en Powershell, j'aurais utilisé ça en effet ;)


En Bash, ceci fonctionne :
Bash:
#!/bin/bash

function valid_ip() {
    local IP=$1
    local stat=1
    declare -a digits_groups

    if [[ $IP =~ ^([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})$ ]]; then
        # DIGITS_GROUPS=${BASH_REMATCH[*]}
        # echo ${DIGITS_GROUPS[*]}
        # We know that it's 4 groups of 3 digits !

        # If 1st digits or last equal 0 : not a valid IP
        if [ $((${BASH_REMATCH[1]})) -eq 0 ]; then
            echo "Digits n°1 ( ${BASH_REMATCH[1]} ) = 0 : it's not OK, not a valid IP !"
            stat=0
            return $stat
        elif [ $((${BASH_REMATCH[4]})) -eq 0 ]; then
            echo "Digits n°4 ( ${BASH_REMATCH[4]} ) = 0 : it's not OK, not a valid IP !"
            stat=0
            return $stat
        fi

        for ((i = 1; i <= 4; i++)); do
            # echo "Digits group n°$i = ${BASH_REMATCH[$i]}"
            digits_groups[$i]=${BASH_REMATCH[$i]}
            # digits_groups[$i]=$((${digits_groups[$i]} + 1))
            # echo "Digits group n°$i = ${digits_groups[$i]}"

            if [ $((${digits_groups[$i]})) -gt 254 ]; then
                # digits > 254 : not a valid IP
                echo "Digits ${digits_groups[$i]} >= 255 : it's not OK, not a valid IP !"
                stat=0
                return $stat
            else
                echo "Digits n°$i : ${digits_groups[$i]} <= 254 -> it's OK !"
            fi
        done

        echo $grp1
        stat=1
        msg="$IP is a valid IP !"
    else
        ## IP address is correct, and returned
        stat=0
        msg="$IP is not a valid IP !"
    fi
    echo "$msg"
    return $stat
}

# valid_ip 000.1.2.200

param_1="$1" # IP du serveur
param_2="$2" # de chaque test

if [ -z "${param_1}" ]; then
    echo -e "Aucun paramètre indiqué !\n"
    echo -e "\t--> iperf_both_ways < IP > < Durée >\n"
    echo -e "\t\tIP = Adresse IP du serveur iperf3\n"
    echo -e "\t\tDurée (facultatif) = Durée d'un test, en seconde, par défaut = 10s \n"
    return 1
fi
valid_ip $param_1
result=$?
if [ $result -eq 0 ]; then
    echo -e "L'adresse IP entrée n'est pas valide : $param_1\n"
    exit 1
fi
if [ -z "${param_2}" ]; then
    param_2=20
fi
iperf3 -c $param_1 -t $param_2 && iperf3 -c $param_1 -t $param_2 -R

# result=$?
# if [ $result -eq 1 ]; then
#     exit 1
# elif [ $result -eq 0 ]; then
#     exit 0
# fi

Mais le souci c'est que ça ne passe pas dans le .zshrc si je mets ce qui suit :
Bash:
function valid_ip() {
    local IP=$1
    local stat=1
    declare -a digits_groups

    if [[ $IP =~ ^([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})$ ]]; then
        # DIGITS_GROUPS=${BASH_REMATCH[*]}
        # echo ${DIGITS_GROUPS[*]}
        # We know that it's 4 groups of 3 digits !

        # If 1st digits or last equal 0 : not a valid IP
        if [ $((${BASH_REMATCH[1]})) -eq 0 ]; then
            echo "Digits n°1 ( ${BASH_REMATCH[1]} ) = 0 : it's not OK, not a valid IP !"
            stat=0
            return $stat
        elif [ $((${BASH_REMATCH[4]})) -eq 0 ]; then
            echo "Digits n°4 ( ${BASH_REMATCH[4]} ) = 0 : it's not OK, not a valid IP !"
            stat=0
            return $stat
        fi

        for ((i = 1; i <= 4; i++)); do
            # echo "Digits group n°$i = ${BASH_REMATCH[$i]}"
            digits_groups[$i]=${BASH_REMATCH[$i]}
            # digits_groups[$i]=$((${digits_groups[$i]} + 1))
            # echo "Digits group n°$i = ${digits_groups[$i]}"

            if [ $((${digits_groups[$i]})) -gt 254 ]; then
                # digits > 254 : not a valid IP
                echo "Digits ${digits_groups[$i]} >= 255 : it's not OK, not a valid IP !"
                stat=0
                return $stat
            else
                echo "Digits n°$i : ${digits_groups[$i]} <= 254 -> it's OK !"
            fi
        done

        echo $grp1
        stat=1
        msg="$IP is a valid IP !"
    else
        ## IP address is correct, and returned
        stat=0
        msg="$IP is not a valid IP !"
    fi
    echo "$msg"
    return $stat
}

function iperf_both_ways()
{
    param_1="$1"    # IP du serveur
    param_2="$2"    # de chaque test

    if [ -z "${param_1}" ]; then
        echo -e "Aucun paramètre indiqué !\n"
        echo -e "\t--> iperf_both_ways < IP > < Durée >\n"
        echo -e "\t\tIP = Adresse IP du serveur iperf3\n"
        echo -e "\t\tDurée (facultatif) = Durée d'un test, en seconde, par défaut = 10s \n"
        return 1
    fi
    valid_ip $param_1
    result=$?
    if [ $result -eq 0 ]; then
        echo -e "L'adresse IP entrée n'est pas valide : $param_1\n"
        return 1
    fi
    if [ -z "${param_2}" ]; then
      param_2=20
    fi
    iperf3 -c $param_1 -t $param_2 && iperf3 -c $param_1 -t $param_2 -R
    return 0
}

Faudrait adapter pour ZSH, mais là je sèche...
Ou alors faudrait pouvoir spécifier un équivalent de shebang /bin/bash dans la fonction valid_ip...

Quelqu'un aurait-il une idée de comment adapter pour ZSH ?
Alors pour zsh, amha ça doit déjà coincer au niveau de l'évaluation en ligne 8, et de la ligne 14...
Il faudrait nous communiquer le résultat de ce.... (JE REVIENS )....
 
j'ai contourner le soucis en plaçant un script iperf_both_ways.sh dans un dossier, et en faisant un alias dans le .zshrc :
Bash:
alias iperf_both_ways='~/"Gitea/Git-et-Powershell_Win10/Scripts macOS/iperf_both_ways.sh"'

Alors pour zsh, amha ça doit déjà coincer au niveau de l'évaluation en ligne 8, et de la ligne 14...
Il faudrait nous communiquer le résultat de ce.... (JE REVIENS )....
Là par contre, je ne sais pas comment faire... à moins de mettre des echo partout XD
car je ne peux pas fait de débuggage avec vscode sur le .zshrc.
Mais j'y pense, je peux changer le shebang du script iperf_both_ways.sh et voir ce que ça donne ^^
 
@shaks2022 Je pense aussi que ce sont les lignes 8 et 14 qui posent soucis, et donc aussi toutes celles qui font appel à ${BASH_REMATCH[x]}
 
@shaks2022 Je pense aussi que ce sont les lignes 8 et 14 qui posent soucis, et donc aussi toutes celles qui font appel à ${BASH_REMATCH[x]}
J'ai installé ksh sur mon fedora. La fonction ne sort pas d'erreur mais ne reconnait pas une IP valide.
Pour avoir plus de détails, tu dois ajouter -x à l'appel de ksh, soit dans la déclaration en 1ere ligne du script rendu exécutable ( chmod +x ) et appelé directement, soit par "ksh -x SCRIPT"
Pourquoi ne pas invoquer l'expression régulière qu'on a construit ici ?
 
J'ai installé ksh sur mon fedora. La fonction ne sort pas d'erreur mais ne reconnait pas une IP valide.
Pour avoir plus de détails, tu dois ajouter -x à l'appel de ksh, soit dans la déclaration en 1ere ligne du script rendu exécutable ( chmod +x ) et appelé directement, soit par "ksh -x SCRIPT"
Pourquoi ne pas invoquer l'expression régulière qu'on a construit ici ?
ksh, c'est pareil que zsh ?
Et je fais comment quand tu parles de mettre -x à l'appel de ksh ? Car dans mon .zshrc, il n'y a aucun appel particulier... ce sont des fonctions...
Et si je fais un .sh avec comme shebang /bin/zsh ça fausse un peu le truc de devoir lancer le script avec un argument -x...

Pour l'expression régulière que tu as donné plus haut, le soucis c'est que je ne sais pas m'en servir pour faire dire au script une chose si c'est vrai, et une autre si ça ne l'est pas : un if, then, else en somme.
En regardant d'un peu plus près ton regex, je me rends compte que ça considéreras comme OK une ip avec 0.0.0.0, ou 255.0.0.255 ou encore 1.2.3.0
Or, une IP ne peux avoir le premier groupe et le dernier égal à 0, ni aucun égal à 255.
Sinon ce ne sont pas des adresses IP mais des masques de sous-réseau ^^
Bon ta regex peut s'adapter assez facilement je pense ;)

Pour le moment, ma solution de contournement, c'est de faire un alias qui appelle le script en bash.
 
ah désolé ,lapsus . je parlais bien de zsh.
si tu as ouvert une session dans un shell quelconque , tu invoques ton code comme ceci:
Code:
. ./monfichierscriptquicontientmesfonctions
Après quoi tu peux directement invoquer tes fonctions.
Et pour activer le mode verbose dans ta session , tu tapes set -x , puis tu testes ce que tu veux, et set +x pour revenir à l'état normal

tu peux aussi poser ton shebang en mode verbose :
#!/bin/zsh -x
 
@shaks2022
J'ai réussi à modifier le script pour qu'il fonctionne avec ZSH :) donc dans mon fichier .zshrc :

Bash:
#!/bin/zsh

valid_ip() {
    local IP=$1
    local stat=1
    declare -a digits_groups

    if [[ $IP =~ ^([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})$ ]]; then
        # DIGITS_GROUPS=${match[*]}
        # echo ${DIGITS_GROUPS[*]}
        # We know that it's 4 groups of 3 digits !

        # If 1st digits or last equal 0 : not a valid IP
        
        if [ $(($match[1])) -eq 0 ]; then
            # DEBUG
            # printf "Digits n°1 ( %d ) = 0 : it's not OK, not a valid IP !\n" ${match[1]}
            stat=0
            return $stat
        elif [ $(($match[4])) -eq 0 ]; then
            # DEBUG
            # printf "Digits n°4 ( %d ) = 0 : it's not OK, not a valid IP !\n" ${match[4]}
            stat=0
            return $stat
        fi

        for ((i = 1; i <= 4; i++)); do
            # echo "Digits group n°$i = ${match[$i]}"
            digits_groups[$i]=$match[$i]
            # digits_groups[$i]=$((${digits_groups[$i]} + 1))
            # echo "Digits group n°$i = ${digits_groups[$i]}"

            if [ $((${digits_groups[$i]})) -gt 254 ]; then
                # digits > 254 : not a valid IP
                # DEBUG
                # printf "Digits n°%d : %d > 254 -> it's not OK, not a valid IP !\n" $i ${digits_groups[$i]}

                stat=0
                return $stat
            else
                # DEBUG
                # printf "Digits n°%d : %d < 255 -> it's OK !\n" $i ${digits_groups[$i]}
            fi
        done

        echo $grp1
        stat=1
        # printf "%s is a valid IP !\n" $IP
    else
        ## IP address is correct, and returned
        stat=0
        # printf "%s is not a valid IP !\n" $IP
    fi
  
    return $stat
}

iperf_both_ways() {
    param_1="$1" # IP du serveur
    param_2="$2" # de chaque test

    if [ -z "${param_1}" ]; then
        # echo -e "Aucun paramètre indiqué !\n"
        # echo -e "\t--> iperf_both_ways < IP > < Durée >\n"
        # echo -e "\t\tIP = Adresse IP du serveur iperf3\n"
        # echo -e "\t\tDurée (facultatif) = Durée d'un test, en seconde, par défaut = 10s \n"
        printf "   Aucun paramètre indiqué !\n"
        printf "\t--> iperf_both_ways < IP > < Durée >\n"
        printf "\t\tIP = Adresse IP du serveur iperf3\n"
        printf "\t\tDurée (facultatif) = Durée d'un test, en seconde, par défaut = 10s \n"
        return 1
    fi
    valid_ip $param_1
    result=$?
    if [ $result -eq 0 ]; then
        # echo -e "L'adresse IP entrée n'est pas valide : $param_1\n"
        printf "L'adresse IP entrée n'est pas valide : %s\n" $param_1
        return 1
    else
        printf "%s est une adresse IP valide. Le test iperf3 va pouvoir s'exéctuer.\n" $param_1

    fi
    if [ -z "${param_2}" ]; then
        param_2=20
    fi
    iperf3 -c $param_1 -t $param_2 && iperf3 -c $param_1 -t $param_2 -R
    printf "\nFin du test iperf3.\n"
}

# Avec le script fait avec les deux fonctions, il faut appeler le script en mettrant l'adresse IP derrière
iperf_both_ways $1
 
  • J'aime
Réactions: shaks2022