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 :

Avis et conseils sur mon script de mise en place automatisée d'un accès VNC par tunnel SSH


Sujet :

Shell et commandes GNU

  1. #21
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ggnore Voir le message
    Bash n'est pas assez regardant de la variable et il est facile de faire des erreurs.
    Que veux-tu dire par là?

    Si c'est la possibilité de se tromper sur le nom des variables, je te conseille l'option set -u en début de script!
    (qui provoque une erreur lors de l'utilisation d'une variable non positionnée)

    Si tu veux de la robustesse, tu peux aussi ajouter set -e qui provoque l'arrêt du script en cas d'erreur non gérée.

    Je dirais qu'un script qui fonctionne avec ces 2 options est passablement robuste!

    J'en ai eu fait quelques uns naguère...

  2. #22
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 891
    Points : 4 157
    Points
    4 157
    Billets dans le blog
    1
    Par défaut
    En cherchant à résoudre le problème suivant:
    Citation Envoyé par ggnore Voir le message
    Quel utilisateur doit lancer ce script ? Est-on sûr qu'il dispose des droits sudo ?
    je bute sur les limites de mes connaissances en administration et sécurité système.

    ça conduit à faire des choix "politiques" d'administration concernant SSH lors d'une authentification par clés:
    - où doivent être enregistrées les clés publiques ? Doivent-elles être gérées pour l'ensemble des utilisateurs, et dans ce cas dans quel répertoire, ou doivent-elles être enregistrées dans le répertoire ssh de chaque utilisateur ?
    - le script doit-il permettre d'installer une autorisation pour l'ensemble des utilisateurs (ce qui rejoint la question précédente), ou doit-il être lancé pour chaque utilisateur pour lequel on veut un accès VNC par tunnel SSH ?
    - dans ce dernier cas, puisqu'il faut des droits root et que l'on ne sait pas si sudo est installé et si l'utilisateur est dans le sudoers, comment récupérer les variables d'environnement de l'utilisateur courant puisque l'on ne sait pas si c'est sudo ou su qui sera utilisé ?

    Avez-vous des conseils à me donner sur ces points ?
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  3. #23
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 891
    Points : 4 157
    Points
    4 157
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    NB: les noms de variables tout en majuscules sont réservés aux variables d'environnement.
    En recherchant d'où me venait cette habitude d'écrire les noms de variables en majuscules, je me suis aperçu que lorsque j'ai eu besoin d'écrire mes premiers scripts, je me suis appuyé sur un script écrit par un ex ingénieur Red Hat.
    J'ai lu à diverses reprises sur Developpez que l'on recommandait effectivement de réserver les majuscules aux variables d'environnement.

    Y aurait-il des "écoles" à ce propos ? ou les habitudes ont-elles changé avec le temps ?
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  4. #24
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 891
    Points : 4 157
    Points
    4 157
    Billets dans le blog
    1
    Par défaut
    Voici une nouvelle version du script.

    Outre les corrections déjà signalées dans un précédent message:
    • Rectification de majuscules/minuscules pour les variables
    • Amélioration de l'installation des paquets requis (en évitant de lancer un apt-get update si ce n'est pas nécessaire)
    • Suppression des espaces en fin de ligne
    • Correction des tabulations
    • Mise en place d'une fonction pour les choix de l'utilisateur
    • Mise en place d'une réponse par défaut
    • Suppression des clear (ils étaient justifiés par le fait que ce script s'adressant à des non spécialistes, j'avais privilégié la lisibilité en me plaçant davantage du point de vue utilisateur de base)
    • Gestion des erreurs


    de nouvelles modifications ont été faites:
    • Vérifie si le fichier de configuration a été modifié pour ne redémarrer openssh que si c'est utile
    • Tient compte du port SSH déjà utilisé pour l'interaction avec l'utilisateur
    • Quelques correctifs portant sur les opérations à faire dans le cas d'une authentification par clés.
    • Divers correctifs suite à des tests plus larges
    • Recueil des infos réseau par ip au lieu de ifconfig
    • En fin d'opérations, choix de l'affichage en html par le navigateur, ou en texte dans la console
    • Intégration de diverses optimisations proposées dans ce fil
    • Intégration de la possibilité de réactiver la connexion par mot de passe dans le cas où le serveur a été configuré pour une authentification par clés uniquement.
    • Restructuration du script à l'aide de fonctions.
    • Vérification que l'utilisateur est bien dans le groupe sudo


    Finalement, après réflexion, à tenter de trop vouloir généraliser, je me suis rendu compte que j'avais perdu de vue ceux à qui était destiné ce script.
    Il intéressera des particuliers ayant de bonnes connaissances en informatique mais n'étant pas des experts, souhaitant mettre facilement en place une prise de contrôle à distance d'un PC pour aider ou dépanner des proches de façon sécurisée.
    Il n'intéressera pas des administrateurs réseaux ou experts qui auront ou créeront leurs propres outils.
    Dès lors le script doit être circonscrit à une installation dans la session de l'utilisateur courant de façon à ce que VNC ne soit démarré que pour cette session. Cela interdit d'avoir un contrôle sur les sessions de tous les utilisateurs d'un même PC.

    Il me reste à creuser résoudre l'important problème suivant que je n'avais pas perçu:
    Citation Envoyé par zipe31 Voir le message
    Sinon, concernant le script, IP_LOCALE=$(hostname -I) à condition qu'il n'y ait qu'une seule interface réseau
    De même pour l'adresse MAC
    Il faut que je fasse une routine qui extraiera les différentes interfaces réseau et leur adresse MAC.
    Le script fournira la liste des interfaces et leur adresse MAC, et précisera ensuite que l'IP locale indiquée pour la redirection de port n'est valable que pour l'interface actuellement utilisée et qu'elle pourra être différente si une autre interface réseau est utilisée.

    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
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    #!/bin/bash
     
    ############################################################
    # Prérequis: le script doit être lancé dans une session    #
    # utilisateur appartenant au groupe sudo.                  #
    #                                                          #
    # Automatise la mise en place d'un contrôle à distance par #
    # VNC sous tunnel SSH.                                     #
    # Ce script s'adapte aux choix de l'utilisateur et rédige  #
    # un mode d'emploi détaillé des opérations restant à faire #
    # sur la box/routeur et sur le poste client.               #
    #                                                          #
    # Auteur: Philippe Ronflette                               #
    ############################################################
    set -u
    set -e
     
    fichier_notice=/tmp/Notice_VNC_par_tunnel_SSH.html
    ports_reserves="0 20 21 23 25 53 68 119 70 80 110 119 137 138 139 143 220 443 445 8080 1863"
    port_ssh=22
    dossier_ssh=~/.ssh/
    ssh_conf=/etc/ssh/sshd_config
    fichier_cles=~/.ssh/authorized_keys
    autostart_vnc=~/.config/autostart/x11vnc.desktop
    usage_cle="faux"
    config_modifiee="faux"
    fichier_log=/tmp/cree_vnc_ssh.log
     
    choix () {
        reponse=" "
        question=$1
        defaut=$2
        until [[ ${reponse} =~ ^[OoNn]$ ]] || [ "$reponse" = "" ] ; do
            echo "$question (O/N) ? par défaut $2"
            read reponse
        done
        if [ -z "$reponse" ]
            then if [ "$defaut" = "oui" ]
                     then return 0
                     else return 1
                 fi
                 exit 0
        fi
        case "$reponse" in
            [Oo]) return 0 ;;
            [Nn]) return 1 ;;
        esac
    }
     
    cree_cles () {
        echo -e "Quel niveau de cryptage souhaitez-vous mettre en place: \n1) Sur 1024 bits \n2) Sur 2048 bits (minimum conseillé) \n3) Sur 4096 bits \n?"
        valide="faux"
        while [ $valide = "faux" ]; do
            read cryptage
            valide="vrai"
            case "$cryptage" in
                *[!1-3]*) echo "Choix non valide. Saisir le nombre 1, 2 ou 3."
                valide="faux"
            esac
        done
        case $cryptage in
            1) cryptage=1024;;
            2) cryptage=2048;;
            3) cryptage=4096;;
        esac
        echo "Veuillez donner un nom à votre fichier de clé:"
        read nom_cle
        if [ -z "$nom_cle" ]
           then nom_cle="id_rsa"
        fi
        echo -e "Il est conseillé de saisir une phrase mot de passe lorsque cela \nvous sera demandé et de ne pas laisser ce champ vide."
        ssh-keygen -t rsa -b $cryptage -f "$dossier_ssh$nom_cle"
        echo "<h2>Fichiers de clé</h2>" >> "$fichier_notice"
        echo "<p>Fichier de clé privée: <b>$dossier_ssh$nom_cle</b></p>" >> "$fichier_notice"
        echo "<p>Fichier de clé publique: <b>$dossier_ssh$nom_cle.pub</b></p>" >> "$fichier_notice"
        cat "$dossier_ssh$nom_cle.pub" >> "$fichier_cles"
        echo "<p>La clé publique a été enregistrée sur ce PC. Vous devrez transférer vos fichiers de clé (privée et publique) <b>$dossier_ssh$nom_cle $dossier_ssh$nom_cle.pub</b> sur le poste client et <b>effacer</b> la clé privée de ce PC pour des raisons de sécurité.</p>" >> "$fichier_notice"
    }
     
    active_mot_passe_ssh () {
        sudo sed -i -e "s/^PasswordAuthentication no$/#PasswordAuthentication yes/g;s/UsePAM no/UsePAM yes/g" "$ssh_conf"
        config_modifiee="vrai"
     
    }
     
    desactive_mot_passe_ssh () {
        sudo sed -i -e "s/^#PasswordAuthentication yes$/PasswordAuthentication no/g;s/UsePAM yes/UsePAM no/g" "$ssh_conf"
        config_modifiee="vrai"
    }
     
    # Vérifie que l'utlisateur peut exécuter le script
    if ! groups | grep sudo >/dev/null
       then echo "Vous ne disposez pas des droits suffisants pour exécuter ce
    script. Il est nécessaire que sudo soit installé et que
    $USER appartienne au groupe sudo."
            exit 1
    fi
    # Redirection d'erreurs vers un fichier log
    exec 2>"$fichier_log"
     
    echo '<!doctype html><html lang="fr"><head><meta content="fr" http-equiv="Content-Language" /><meta content="text/html; charset=utf-8" http-equiv="Content-Type" /><style type="text/css">
    body {bgcolor="EAF4FF"}
    h1 {text-align: center;background-color: #006699;color: #FFFFFF;padding-top: 5px;padding-bottom: 5px}
    h2 {background-color: #66CCFF}
    h3 {background-color: #99CCFF}
    code {display: block;background-color: #000000;color: #FFFFFF;width: 100%; padding-top: 5px; padding-bottom: 5px}</style>
    <title>Notice VNC par tunnel SSH</title></head><body><h1>VNC par tunnel SSH</h1>' > "$fichier_notice"
     
    # Récupération des informations nécessaires aux configurations
    echo -e "Veuillez patienter pendant la récupération des informations
    système nécessaires à la configuration.
    -----------------------------------------------------------\n"
    ip_locale=$(hostname -I)
    mac=$(ip a | grep ether | sed "s/^.*ether/ether/g" | tr -s ' ' | cut -d ' ' -f 2)
    #ip_distante=$(curl ifconfig.me)
    ip_distante=$(dig +short myip.opendns.com @resolver1.opendns.com)
     
    # Installation des paquets nécessaires
    paquets_recharges="faux"
    for paquet_requis in openssh-server x11vnc; do
        if ! dpkg -l | grep "$paquet_requis" >/dev/null
           then if [ $paquets_recharges = "faux" ]
                   then sudo apt-get update
                        paquets_recharges="vrai"
                fi
           echo -e "+++++++++++++++++++++++++++++++++++++++++++++++++++++
    L'installation de paquets complémentaires est nécessaire.
    Veuillez accepter les installations si la question vous
    est posée.
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
           sudo apt-get install "$paquet_requis"
           if ! dpkg -l | grep "$paquet_requis" >/dev/null
              then "Des paquets requis n'ont pu être installés. Le script va s'arrêter.
    Vous pouvez consulter le fichier $fichier_log pour connaître
    le détail des erreurs rencontrées."
                    exit 1
           fi
        fi
    done
     
    if ! [ -e "$ssh_conf" ]
       then echo -e "Le fichier de configuration de SSH n'existe pas.
    Le script va s'arrêter. Veuillez vérifier que OpenSSH a bien
    été installé."
            exit 1
    fi
    port_inscrit=$(cat /etc/ssh/sshd_config | grep -w "Port" | cut -d ' ' -f 2)
    port_ssh="$port_inscrit"
    echo -e "
    ############################################################
     
                        CONFIGURATION DE SSH
     
    ############################################################
     
    1- Choix du N° de port
    ----------------------
     
    Par défaut, SSH utilise le port 22. Pour des raisons de
    sécurité, il est conseillé d'utiliser un autre port.
    Actuellement le port utilisé est le port $port_inscrit.
    "
     
    if ! choix "Voulez-vous conserver le port $port_inscrit" "oui"
        then valide="faux"
             while [ $valide = "faux" ]; do
                 port_demande=""
                 until [[ ${port_demande} =~ ^[0-9]+$ ]]; do
                    echo "Indiquez un N° de port pour SSH (>0 et <65535):"
                    read port_demande
                 done
                 valide="vrai"
                 if [ $port_demande -lt 0 ] || [ $port_demande -ge 65535 ]
                    then echo "$port_demande n'est pas un N° de port valide."
                         valide="faux"
                    else if grep -w -F "${port_demande}" <<<"${ports_reserves}" >/dev/null
                            then echo -e "Ce N° de port peut être utilisé par un autre protocole."
                                 if ! choix "Confirmez-vous ce N° de port" "non"
                                    then valide="faux"
                                 fi
                         fi
                 fi
             done
             port_ssh="$port_demande"
    fi
     
    sudo sed -i -e "s/#*Port.*$/Port $port_ssh/g" "$ssh_conf"
    echo "<p>IP publique: <b>$ip_distante</b><p><p>Port SSH: <b>$port_ssh</b><p>" >> "$fichier_notice"
    echo "<h2>Redirection de port</h2><p>Sur votre box/routeur, vous devrez rediriger le port <b>$port_ssh</b> vers l'adresse IP locale de ce PC. Voici les informations dont vous aurez besoin:<br/>Adresse IP locale: <b>$ip_locale</b><br/>Adresse mac: <b>$mac</b><br/>Protocole: <b>TCP</b></p>" >> "$fichier_notice"
    if ! [ "$port_ssh" = "$port_inscrit" ]
       then config_modifiee="vrai"
    fi
     
    echo "----------------------------
    2- Authentification par clés
    ----------------------------"
     
    if cat /etc/ssh/sshd_config | grep -x "UsePAM no" >/dev/null
       then echo "Le serveur est configuré pour ne pas autoriser la connexion
    par mot de passe. Si vous ne disposez pas déjà d'une clé
    publique, il vous faudra en créer une pour pouvoir vous
    connecter, ou réactiver la possibilité de se connecter par
    mot de passe."
            if choix "Souhaitez-vous réactiver la connexion par mot de passe" "non"
               then active_mot_passe_ssh
               else usage_cles="vrai"
                    if choix "Souhaitez-vous générer de nouvelles clés" "oui"
                       then cree_cles
                       else echo "<p>Clés d'authentification: vous avez choisi de ne pas créer de nouvelles clés.<br/>Pour utiliser une clé publique existante, copiez-en le contenu sur le fichier de clés publiques de ce PC avec la commande suivante (le chemin d'accès à la clé publique sera à adapter):<br/><code>cat /chemin/cle.pub >> $fichier_cles</code></p>" >> "$fichier_notice"
                    fi
            fi
        else echo "Par défaut, l'authentification du client sur le serveur se
    fait par nom d'utilisateur et mot de passe.
    Si cette solution peut suffire dans un réseau privé, elle
    est insuffisamment sécurisée lors d'un accès par Internet
    où une authentification par clés est préférable.
    "
            if choix "Souhaitez-vous mettre en place une authentification par clés" "non"
               then if ! [ -e "$fichier_cles" ]
                       then if ! [ -e "$dossier_ssh" ]
                            then mkdir "$dossier_ssh" ]
                                 chmod 0700 "$dossier_ssh"
                            fi
                            touch "$fichier_cles"
                            chmod 0644 "$fichier_cles"
                    fi
                    usage_cle="vrai"
                    echo -e "Si vous disposez déjà d'une clé publique sur le poste client, celle-ci \npeut être utilisée sans qu'il soit nécessaire de créer de \nnouvelles clés."
                    if choix "Souhaitez-vous générer de nouvelles clés" "oui"
                       then cree_cles
                       else echo "<p>Clés d'authentification: vous avez choisi de ne pas créer de nouvelles clés.<br/>Pour utiliser une clé publique existante, copiez-en le contenu sur le fichier de clés publiques de ce PC avec la commande suivante (le chemin d'accès à la clé publique sera à adapter):<br/><code>cat /chemin/cle.pub >> $fichier_cles</code></p>" >> "$fichier_notice"
                    fi
                    echo -e "Vous avez mis en place une authentification par clés.\nCependant, l'accès par nom d'utilisateur et mot de passe est\ntoujours possible.\n"
                    if choix "Voulez-vous interdire l'authentification par mot de passe" "oui"
                       then desactive_mot_passe_ssh
                    fi
            fi
    fi
     
    # Redémarre le serveur SSH si le fichier de configuration a été modifié
    if [ "$config_modifiee" = "vrai" ]
       then sudo /etc/init.d/ssh restart
    fi
     
    echo "############################################################
     
                        CONFIGURATION DE VNC
     
    ############################################################
     
    ---------------------------
    1- Configuration du serveur
    ---------------------------
     
    Il vous faudra démarrer manuellement le serveur VNC pour y
    accéder, sauf si vous paramétrez un démarrage automatique
    à l'ouverture de la session de l'utilisateur courant.
    "
     
    if choix "Voulez-vous démarrer automatiquement le serveur VNC à l'ouverture de la session" "non"
       then if ! [ -d ~/.config/autostart ]
               then mkdir ~/.config/autostart
            fi
            if ! [ -e  "$autostart_vnc" ]
               then echo -e "[Desktop Entry]\nType=Application\nName=x11vnc\nExec=x11vnc -localhost -many" > "$autostart_vnc"
                    echo -e "Vous devrez redémarrer votre session pour que les\nchangements prennent effet.\n"
               fi
            chmod +x "$autostart_vnc"
            echo -e "Vous devrez redémarrer votre session pour que les\nchangements prennent effet.\n"
            echo "<p>Le serveur VNC est configuré pour être lancé au démarrage de la session. Aucune opération supplémentaire ne sera donc nécessaire sur le serveur.</p>" >> "$fichier_notice"
       else if [ -e  "$autostart_vnc" ]
               then rm  "$autostart_vnc"
                    echo -e "Vous devrez redémarrer votre session pour que les\nchangements prennent effet.\n"
            fi
            echo "<p>Vous avez choisi de ne pas lancer le serveur VNC au démarrage de la session. Vous devrez le lancer manuellement, à partir d'une session SSH, en saisissant la commande suivante: <br/><code>x11vnc -localhost -many </code></p>" >> "$fichier_notice"
    fi
     
    ##################################################################################
    # Inscription des informations de configuration du client dans le fichier notice #
    ##################################################################################
     
    echo "<h2>Configuration du client</h2>
    <p><b>ATTENTION:</b> l'IP distante utilisée dans ce qui suit est celle qui a été renvoyée par le serveur lors de l'installation. Si vous ne disposez pas d'une IP fixe, cette adresse changera et vous ne pourrez donc plus accéder au serveur. Dans le cas d'une IP dynamique, il est nécessaire de passer par un service permettant de rediriger les IP dynamiques vers une IP fixe qu'il faudra utiliser comme adresse dans les commandes ci-dessus.</p>
    <h3>Client Linux</h3>
    <p>Pour accéder au serveur à partir d'un client Linux, voici comment procéder.</p>
    <p>- Ouvrez un terminal et saisissez la commande suivante pour ouvrir le tunnel SSH" >> "$fichier_notice"
    if [ $usage_cle = "faux" ]
       then  echo "<br/><code>ssh $USER@$ip_distante -p $port_ssh -L 5900:localhost:5900</code>" >> "$fichier_notice"
       else  echo "Vous devez d'abord modifier les droits du fichier de clé privée de la manière suivant, cette opération n'étant à faire qu'une fois (le chemin d'accès à la clé privée est à adapter):<br/><code>chmod 0600 /chemin/cle-privee</code>" >> "$fichier_notice"
             echo "</br>Pour vous connecter, saisissez la commande suivante:<br/><code>ssh $USER@$ip_distante -i /chemin/cle-privee -p $port_ssh -L 5900:localhost:5900</code>" >> "$fichier_notice"
    fi
    echo "<br/>- Lancez votre logiciel client VNC et indiquez-lui comme adresse
    <br/><code>localhost</code>
    <p>Pour vous connecter en une seule opération, vous pouvez également utiliser le script suivant. Copiez-en le contenu dans un fichier auquel vous donnerez le nom de votre choix, puis donnez-lui le droit d'exécution. Ce script suppose que vous avez installé le client VNC tightvncviewer." >> "$fichier_notice"
    if [ $usage_cle = "faux" ]
       then  echo " N'oubliez pas, si nécessaire, de modifier l'adresse IP distante.<br/><code>#!/bin/bash<br/>xterm -e \"ssh $USER@$ip_distante -p $port_ssh -L 5900:localhost:5900; $SHELL\" &" >> "$fichier_notice"
       else  echo " N'oubliez pas d'adapter le chemin d'accès à la clé privée, et, si nécessaire, de modifier l'adresse IP distante.<br/><code>#!/bin/bash<br/>xterm -e \"ssh $USER@$ip_distante -i /chemin/cle-privee -p $port_ssh -L 5900:localhost:5900; $SHELL\" &" >> "$fichier_notice"
    fi
    echo "<br/>sleep 10
    <br/>xterm -e \"vncviewer localhost\"
    <br/>exit 0</code></p>
    <h3>Client Windows</h3>
    <p>Pour accéder au serveur à partir d'un client Windows, voici comment procéder.</p>
    <p> Convertissez votre fichier de clé privée au format PuTTy à l'aide du logiciel PuTTyGen</p>
    <p>Créez le tunnel SSH avec les logiciels PuTTY ou KiTTY paramétrés de la manière suivante:</p>
    <p><b>Section Session</b><br/>Champ Hostname * * <b>$ip_distante</b><br/>Champ port * * * * * * <b>$port_ssh
    <br/>Section Connection --> SSH --> Tunnels</b><br/>Champ Source port * * <b>5900</b><br/>Champ Destination * * *<b>localhost:5900</b><br/>et cliquez sur [Add]
    <br/>" >> "$fichier_notice"
    if [ $usage_cle = "vrai" ]
       then  echo "<b>Section Connection --> SSH --> Auth</b><br/>Champ Private key for authentification * * Entrez le chemin d'accès au fichier de clé privée</p>" >> "$fichier_notice"
    fi
    echo "<p>Lancez la connexion SSH avec PuTTY ou KiTTY puis lancez un client VNC avec le champ d'adresse du serveur paramétré à <b>localhost</b></p>" >> "$fichier_notice"
     
    echo "#########################################################
     
                        FINALISATION
     
    #########################################################
    "
     
    echo "</body></html>" >> "$fichier_notice"
     
    echo -e "Les paramétrages du serveur sont terminés. :-)
     
    Un fichier avec les informations utiles et détaillant les
    opérations restant à effectuer a été créé. Il indique également
    comment prendre le contrôle à distance de ce PC. Vous pourrez
    en prendre connaissance en ouvrant le fichier $fichier_notice.
    "
    if choix "Désirez-vous en prendre connaissance maintenant" "non"
       then echo -e "1) Ouvrir le fichier html dans le navigateur \n2) Afficher en texte dans ce terminal"
            valide="faux"
            while [ $valide = "faux" ]; do
                read type_affichage
                valide="vrai"
                case "$type_affichage" in
                    *[!1-2]*) echo "Choix non valide. Saisir le nombre 1 ou 2."
                              valide="faux"
                esac
            done
            case $type_affichage in
                1) xdg-open "$fichier_notice" &;;
                2) cat /tmp/Notice_VNC_par_tunnel_SSH.html | tr "\n$" "|" | sed -e "s/^.*<\/head>//g;s/<br\/>/\\n/g;s/<\/p>/\\n/g;s/<[a-zA-Z0-9/]*>//g" | tr "|" "\n";;
            esac
    fi
     
    exit 0
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  5. #25
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Pour récupérer l'adresse mac :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mac=$(ip a | awk '/ether/{print $2;exit}')
    plutôt qu'un empilement de sed/tr/cut
    Je n'ai pas tout lu mais je pense qu'il y a plusieurs constructions du même type.
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    port_inscrit=$(cat /etc/ssh/sshd_config | grep -w "Port" | cut -d ' ' -f 2)
    port_ssh="$port_inscrit"
    Ici, pourquoi 2 variables ?
    Cordialement.

  6. #26
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 891
    Points : 4 157
    Points
    4 157
    Billets dans le blog
    1
    Par défaut
    Pour récupérer l'adresse mac :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mac=$(ip a | awk '/ether/{print $2;exit}')
    plutôt qu'un empilement de sed/tr/cut
    Je n'ai pas tout lu mais je pense qu'il y a plusieurs constructions du même type.
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    port_inscrit=$(cat /etc/ssh/sshd_config | grep -w "Port" | cut -d ' ' -f 2)
    port_ssh="$port_inscrit"
    Je ne maîtrise pas encore awk ! Il va falloir que je m'y mette.
    La routine que je dois faire pour extraire les différentes interfaces réseau avec leur adresse mac va me donner l'occasion de m'y plonger !

    Ici, pourquoi 2 variables ?
    Cordialement.
    ça permet de tester s'il y a eu changement de port par rapport au fichier de configuration, et de ne relancer le serveur SSH que si nécessaire.
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  7. #27
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Sans utiliser awk, il est possible de faire ça en shell.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mac=$(ip a);newmac="${mac##*ether }";[ "$newmac" != "$mac" ] && (newmac="${newmac%% *}";echo "$newmac") || echo "pas d'ip"
    Mais il est quand même faisable de regarder awk !
    ça permet de tester s'il y a eu changement de port par rapport au fichier de configuration, et de ne relancer le serveur SSH que si nécessaire.
    Je me demande ce qu'il est possible de tester avec deux variables ayant la même valeur !!
    Cordialement.

  8. #28
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 891
    Points : 4 157
    Points
    4 157
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ctac_ Voir le message
    Je me demande ce qu'il est possible de tester avec deux variables ayant la même valeur !!
    Cordialement.
    Tu me fais avoir un doute, mais port_ssh est modifié et donc différent de port_inscrit s'il y a demande de changement de port. Avec la possibilité de choix par défaut et la nécessité de vérifier la validité de port_demande initialisé en conséquence à une valeur vide, il me faut bien 3 variables.
    Je vérifierai toutefois demain à tête reposée.
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  9. #29
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Je persiste à croire que ip_locale=$(hostname -I) n'est pas adéquat s'il existe plus d'une interface réseau.

    Mais bon, admettons qu'il n'y en ait qu'une. Dans ce cas pour obtenir l'adresse MAC, il existe un fichier nommé "address" dans le répertoire "/sys/class/net/NOM_INTERFACE/" qui contient l'adresse MAC de la carte. Donc, plutôt qu'une commande à rallonge mac=$(ip a | grep ether | sed "s/^.*ether/ether/g" | tr -s ' ' | cut -d ' ' -f 2), celle-ci devrait faire l'affaire : cat /sys/class/net/[!l]*/address
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  10. #30
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 891
    Points : 4 157
    Points
    4 157
    Billets dans le blog
    1
    Par défaut
    @ctac_

    Ma tête reposée de ce matin m'a glissé que 2 variables suffisent pour l'ensemble du 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
    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
    port_inscrit=$(cat /etc/ssh/sshd_config | grep -w "Port" | cut -d ' ' -f 2)
    port_ssh="$port_inscrit"
    echo -e "
    ############################################################
     
                        CONFIGURATION DE SSH
     
    ############################################################
     
    1- Choix du N° de port
    ----------------------
     
    Par défaut, SSH utilise le port 22. Pour des raisons de
    sécurité, il est conseillé d'utiliser un autre port.
    Actuellement le port utilisé est le port $port_inscrit.
    "
     
    if ! choix "Voulez-vous conserver le port $port_inscrit" "oui"
        then valide="faux"
             while [ $valide = "faux" ]; do
                 port_ssh=""
                 until [[ ${port_ssh} =~ ^[0-9]+$ ]]; do
                    echo "Indiquez un N° de port pour SSH (>0 et <65535):"
                    read port_ssh
                 done
                 valide="vrai"
                 if [ $port_ssh -lt 0 ] || [ $port_ssh -ge 65535 ]
                    then echo "$port_ssh n'est pas un N° de port valide."
                         valide="faux"
                    else if grep -w -F "${port_ssh}" <<<"${ports_reserves}" >/dev/null
                            then echo -e "Ce N° de port peut être utilisé par un autre protocole."
                                 if ! choix "Confirmez-vous ce N° de port" "non"
                                    then valide="faux"
                                 fi
                         fi
                 fi
             done
    fi
     
    sudo sed -i -e "s/#*Port.*$/Port $port_ssh/g" "$ssh_conf"
    echo "<p>IP publique: <b>$ip_distante</b><p><p>Port SSH: <b>$port_ssh</b><p>" >> "$fichier_notice"
    echo "<h2>Redirection de port</h2><p>Sur votre box/routeur, vous devrez rediriger le port <b>$port_ssh</b> vers l'adresse IP locale de ce PC. Voici les informations dont vous aurez besoin:<br/>Adresse IP locale: <b>$ip_locale</b><br/>Adresse mac: <b>$mac</b><br/>Protocole: <b>TCP</b></p>" >> "$fichier_notice"
    if ! [ "$port_ssh" = "$port_inscrit" ]
       then config_modifiee="vrai"
    fi
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  11. #31
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 891
    Points : 4 157
    Points
    4 157
    Billets dans le blog
    1
    Par défaut
    @zipe31

    J'ai bien entendu pris en compte ta remarque justifiée. Regarde la seconde partie de mon message #24

    Il me reste à creuser résoudre l'important problème suivant que je n'avais pas perçu:
    Citation Envoyé par zipe31
    Sinon, concernant le script, IP_LOCALE=$(hostname -I) à condition qu'il n'y ait qu'une seule interface réseau
    De même pour l'adresse MAC
    Il faut que je fasse une routine qui extraiera les différentes interfaces réseau et leur adresse MAC.
    Le script fournira la liste des interfaces et leur adresse MAC, et précisera ensuite que l'IP locale indiquée pour la redirection de port n'est valable que pour l'interface actuellement utilisée et qu'elle pourra être différente si une autre interface réseau est utilisée.
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  12. #32
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par Philippe Dpt35 Voir le message
    @zipe31

    J'ai bien entendu pris en compte ta remarque justifiée. Regarde la seconde partie de mon message #24
    Oups j'avais raté cette partie là, désolé

    Sinon, pour connaître l'interface principale en cas de multiples cartes, la commande ip route show default renvoie la passerelle active, ça peut servir à déterminer l'interface principale.

    Voilà ce que ça me renvoie chez moi avec plusieurs interfaces :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ip route show default
    default via 192.168.10.1 dev eth0  proto static 
    192.168.10.0/24 dev eth0  proto kernel  scope link  src 192.168.10.18  metric 1 
    192.168.12.0/24 dev vmnet8  proto kernel  scope link  src 192.168.12.1 
    192.168.132.0/24 dev vmnet1  proto kernel  scope link  src 192.168.132.1 
    192.168.200.0/24 dev wlan4  proto kernel  scope link  src 192.168.200.106  metric 9
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  13. #33
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 891
    Points : 4 157
    Points
    4 157
    Billets dans le blog
    1
    Par défaut
    En essayant de comprendre la proposition de ctac_
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mac=$(ip a);newmac="${mac##*ether }";[ "$newmac" != "$mac" ] && (newmac="${newmac%% *}";echo "$newmac") || echo "pas d'ip"
    je suis retombé sur cette page d'un document que j'avais mis de côté:
    https://abs.traduc.org/abs-fr/ch10.h...g-Manipulation

    Comme l'écrit l'auteur:
    Bash supporte un nombre impressionnant d'opérations de manipulation des chaînes de caractères. Malheureusement, ces outils manquent un peu de cohérence. Certains sont un sous-ensemble de la substitution de paramètres et les autres font partie des fonctionnalités de la commande UNIX expr. Ce qui produit une syntaxe de commandes non unifiée et des fonctionnalités qui se recoupent, sans parler de la confusion engendrée.
    A cela s'ajoutent les possibilités de awk.

    Quand on fait, comme moi, un script quand on en a besoin, c'est-à-dire tous les 3 ou 4 mois, on doit tout réapprendre à chaque fois !
    Dans ces conditions, où il est très difficile de tout aborder et retenir, que me conseillez-vous si je dois investir de mon temps de façon "rentable" ? Me concentrer sur awk ou sur les outils de manipulation de chaînes de caractères du bash ?
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 538
    Points : 19 360
    Points
    19 360
    Par défaut
    on doit tout réapprendre à chaque fois
    ou avoir des marque-pages bien organisés.

    si je dois ne traiter que des fichiers textes, je fais un script awk.
    si je dois interagir avec le système, je reste en "full bash".
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #35
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 891
    Points : 4 157
    Points
    4 157
    Billets dans le blog
    1
    Par défaut
    Que pensez-vous de cette routine pour extraire les informations d'interface réseau ?

    J'ai "paresseusement" exploité les suggestions de ctac_ (on verra plus tard pour awk)

    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
    ct=0
    ip a >/tmp/interfaces_reseau
    while read ligne; do
        if echo "$ligne" | grep "^[0-9]" >/dev/null
            then ((ct+=1))
                 interfaces[$ct]=${ligne#*: };
                 interfaces[$ct]=${interfaces[$ct]%%:*}
                 statut=${ligne##*state }
                 statut=${statut%% *}
                 if [ ${statut} = "UP" ]
                    then actif=$ct
                 fi
        fi
        if echo "$ligne" | grep "ether">/dev/null
           then macs[$ct]=${ligne#*ether }
                macs[$ct]=${macs[$ct]%% *}
        fi
        if echo "$ligne" | grep "inet ">/dev/null
           then ips[$ct]=${ligne#*inet }
                ips[$ct]=${ips[$ct]%%/*}
        fi
    done < /tmp/interfaces_reseau
    ct=1
    echo ${interfaces[*]}
    echo ${macs[*]}
    echo ${ips[*]}
    echo "L'interface active est actuellement ${interfaces[$actif]} avec l'adresse MAC ${macs[$actif]} et l'adresse IP locale ${ips[$actif]}"
    J'avais commencé par faire la même chose sans passer par un fichier en utilisant la structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ip a |
    while read ligne; do
       .....
    done
    mais curieusement les variables utilisées dans cette boucle n'ont qu'une valeur locale, elles sont vides en sortie de boucle. J'ai galéré un bon bout de temps avant de trouver pourquoi ça ne marchait pas.
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 538
    Points : 19 360
    Points
    19 360
    Par défaut
    oui, en bash, les pipe sont exécutés dans un sous-shell; les variables qui y sont déclarées ne sont pas accessibles au processus parent.

    on peut désormais, pour le coup, utiliser une substitution de processus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read info; do :; done < <(commande)
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #37
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    891
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Instituteur retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2015
    Messages : 891
    Points : 4 157
    Points
    4 157
    Billets dans le blog
    1
    Par défaut
    Merci pour l'explication et la solution.
    Une commande avec une série de pipe lance donc, si je comprends bien, des sous-shell récursivement ? Ce qui justifierait d'éviter des pipe en chaîne ?
    Plus on apprend, plus on découvre que ce que l'on sait est insignifiant face à tout ce que l'on ne sait pas.
    Retrouvez la liste de mes articles et tutoriels sur la sauvegarde-restauration, les distributions éducatives, le système Linux et le Raspberry pi en cliquant sur ce lien.

  18. #38
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    Quelques observations :
    -utilisation d'un compteur alors que les interfaces sont numérotées.
    -utilisation de echo ... | grep pour vérifier un patern
    alors qu'un test suffit comme suggéré dans le #27
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if echo "$ligne" | grep "^[0-9]" >/dev/null
    -utilisation d'un fichier intermédiaire
    Voir la proposition de N_BaH dans le #36
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ip a >/tmp/interfaces_reseau
    -Ce fichier n'est pas supprimé avant un redémarrage.

    Voici un script qui fonctionne avec dash et qui fait (presque) la même chose.
    pas de retour tableau avec toutes les interfaces mais est ce nécessaire ?
    Le temps d'exécution est divisé au moins par 10.
    Il est certainement perfectible.
    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
    #!/bin/sh
     
    ret=$(ip a |
    while read ligne; do
    if [ -z "$cnt" ] ; then
    	cnt="${ligne%%:*}"
    	if [ -z "$cnt" ] ; then
    		continue
    	fi
    	etat="${ligne#*state }"
    	etat="${etat%% *}"
    	if [ "$etat" != "UP" ] ; then
    		cnt=""
    		continue
    	fi
    	nom="${ligne#*: }"
    	nom="${nom%%:*}"
    	continue
    else
    	if [ -z "$mac" ] ; then
    		mac="${ligne#*ether }"
    		mac="${mac%% *}"
    		continue
    	else
    		inet="${ligne#inet }"
    		inet="${inet%/*}"
    		echo "$cnt" "$nom" "$mac" "$inet"
    		break
    	fi
    fi
    done)
     
    inet="${ret##* }"
    nom="${ret#* }"
    nom="${nom%% *}"
    mac="${ret#* * }"
    mac="${mac% *}"
    numero="${ret%% *}"
     
    echo
    echo "L'interface n° $numero est actuellement active."
    echo "Elle s'appelle $nom \
    avec l'adresse MAC $mac et l'adresse IP locale est $inet"
    echo
    Cordialement.

  19. #39
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Pour peaufiner, je propose la petite modification suivante (utile sous macos...):
    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
    #!/bin/sh
     
    ret=$(ip a)
    if [ $? -ne 0 ]; then
    	echo "could not execute 'ip'" 1>&2
    	exit 1
    fi
     
    ret=$(echo "$ret" |
    while read ligne; do
    if [ -z "$cnt" ] ; then
    	cnt="${ligne%%:*}"
    	if [ -z "$cnt" ] ; then
    		continue
    	fi
    	etat="${ligne#*state }"
    	etat="${etat%% *}"
    	if [ "$etat" != "UP" ] ; then
    		cnt=""
    		continue
    	fi
    	nom="${ligne#*: }"
    	nom="${nom%%:*}"
    	continue
    else
    	if [ -z "$mac" ] ; then
    		mac="${ligne#*ether }"
    		mac="${mac%% *}"
    		continue
    	else
    		inet="${ligne#inet }"
    		inet="${inet%/*}"
    		echo "$cnt" "$nom" "$mac" "$inet"
    		break
    	fi
    fi
    done)
     
    inet="${ret##* }"
    nom="${ret#* }"
    nom="${nom%% *}"
    mac="${ret#* * }"
    mac="${mac% *}"
    numero="${ret%% *}"
     
    echo
    echo "L'interface n° $numero est actuellement active."
    echo "Elle s'appelle $nom \
    avec l'adresse MAC $mac et l'adresse IP locale est $inet"
    echo

  20. #40
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    345
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 345
    Points : 539
    Points
    539
    Par défaut
    Bonjour,
    J'avais regarder sur OpenBSD qui ne connaît pas ip non plus mais ifconfig.
    De plus, la sortie n'est pas formattée de la même façon donc difficile de faire un truc portable.
    En bricolant un peu, je me suis aperçu qu'on pouvait utiliser les classes de caractères nommée
    dans les Parameter Expansion du shell.
    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
     
    #!/bin/sh
    ret=$(ip a)
    while [ "$ret" ]
    do
    # recuperation de la première ligne
    	ligne="${ret%%[[:cntrl:]]*}"
    	if [ "${ligne#* UP }" = "$ligne" ] ; then
    # si interface non UP suppression des 6 premières lignes
    		ret="${ret#*[[:cntrl:]]*[[:cntrl:]]*[[:cntrl:]]*[[:cntrl:]]*[[:cntrl:]]*[[:cntrl:]]*}"
    	else
    # interface UP recuperation des données
    		cnt="${ligne%%:*}"
    		nom="${ligne#*: }"
    		nom="${nom%%:*}"
    		ret="${ret#$ligne[[:cntrl:]]}"
    		ligne="${ret%%[[:cntrl:]]*}"
    		mac="${ligne#*ether }"
    		mac="${mac%% *}"
    		ret="${ret#$ligne[[:cntrl:]]}"
    		ligne="${ret%%[[:cntrl:]]*}"
    		inet="${ligne#*inet }"
    		inet="${inet%/*}"
    # on quitte
    		ret=""
    	fi
    done
    echo
    echo "L'interface n° $cnt est actuellement active."
    echo "Elle s'appelle $nom \
    avec l'adresse MAC $mac et l'adresse IP locale est $inet"
    echo
    Je me suis dit qu'on pouvait certainement faire des petites fonctions pour simuler head et tail.
    Mais ça ne fonctionne pas comme je voudrais.
    Donc pour éviter que Philippe Dpt35 se perde dans le tunnel avec ssh
    Je vais ouvrir un nouveau sujet.

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/11/2009, 19h12
  2. Automatiser la mise en place d'un bureau Windows XP
    Par MacGyverIII dans le forum Windows XP
    Réponses: 5
    Dernier message: 30/10/2008, 16h16
  3. Script de sauvegarde avec mise en place de l'ARCHIVELOG
    Par phil4444 dans le forum Administration
    Réponses: 4
    Dernier message: 24/04/2008, 18h35
  4. Réponses: 0
    Dernier message: 14/03/2008, 23h33

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