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. #1
    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 Avis et conseils sur mon script de mise en place automatisée d'un accès VNC par tunnel SSH
    Bonjour,

    Suite à cette discussion
    https://www.developpez.net/forums/d1...-distance-vnc/
    et dans le cadre d'un projet que je suis en train de réaliser, j'ai développé un script pour les distributions Linux basées sur Debian afin d'automatiser la mise en place d'un contrôle à distance par VNC sous tunnel SSH pour des non spécialistes.

    Ce script permet à l'utilisateur d'effectuer divers choix:
    - modification ou non du port SSH
    - mise en place d'une authentification par login et mot de passe ou par clés
    - démarrage manuel ou automatique du serveur VNC

    Le script propose en fin de parcours une notice en html détaillant pas à pas les opérations à faire sur le routeur/box Internet et sur le poste client (Linux et Windows) en fonction des choix de l'utilisateur, en fournissant les informations système nécessaires:
    - IP locale
    - IP publique
    - adresse MAC

    Ce script, testé chez moi en local et par Internet, nécessite des tests plus larges sur diverses distributions de la famille avant une mise à disposition publique.
    Une relecture par des spécialistes afin d'en gommer d'éventuelles maladresses (je ne suis pas un spécialiste du bash) serait également la bienvenue.

    Merci d'avance pour vos contributions.

    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
     
    #!/bin/bash
     
    ############################################################
    # Script permettant d'automatiser 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                               #
    ############################################################
     
    > notice.html
    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">
    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 bgcolor="EAF4FF"><h1 style="text-align: center">VNC par tunnel SSH</h1>' >> notice.html
     
    fichier_notice=~/notice.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
    reponse=""
    DOSSIER_SSH=~/.ssh/
    SSH_CONF=/etc/ssh/sshd_config
    FICHIER_CLES=~/.ssh/authorized_keys
    AUTOSTART_VNC=~/.config/autostart/x11vnc.desktop
    usage_cle="faux"
     
    # Récupération des informations nécessaires aux configurations
    clear
    echo -e "Veuillez patienter pendant la récupération des informations
    système nécessaires à la configuration.
    -----------------------------------------------------------\n"
    IP_LOCALE=$(hostname -I)
    MAC=$(sudo ifconfig | grep HWaddr | sed "s/^.*HWaddr/HWaddr/g" | tr -s ' ' | cut -d ' ' -f 2)
    #IP_DISTANTE=$(curl ifconfig.me)
    IP_DISTANTE=$(dig +short myip.opendns.com @resolver1.opendns.com)
     
    clear
    # Installation de OpenSSH et x11VNC si nécessaire
    if ! dpkg -l | grep openssh-server > /dev/null
       then echo -e "Le serveur OpenSSH n'est pas installé. \nVeuillez patienter durant son installation."
    	    sudo apt-get update && sudo apt-get install openssh-server	
    fi
    if ! dpkg -l | grep x11vnc > /dev/null
       then echo -e "Le serveur VNC n'est pas installé. \nVeuillez patienter durant son installation."
    	    sudo apt-get update && sudo apt-get install x11vnc	
    fi
     
    clear
    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. "
     
    reponse=""
    until [[ ${reponse} =~ ^[OoNn]$ ]]; do
       echo "Voulez-vous conserver le port 22 ? (O/N)"
       read reponse
    done
    case "$reponse" in
        [!Oo]) 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 port_present=0
    	                   for port in ${ports_reserves[*]}; do
    				           if [ "$port_demande" = "$port" ]
    				              then port_present=1
    			               fi
    			           done
    	                   if [ "$port_present" = "1" ]   
    		                  then echo -e "Ce N° de port peut être utilisé par un autre protocole."
                                   reponse=""
                                   until [[ ${reponse} =~ ^[OoNn]$ ]]; do
                                       echo "Confirmez-vous ce N° de port ? (O/N)"
                                       read reponse
                                   done
    		                       case "$reponse" in
                                       [!Oo]) valide="faux"
                                              ;;
                                   esac
                           fi
                   fi
                done
                port_ssh="$port_demande"
                ;;
    esac
    if ! [ -e $SSH_CONF ]
       then echo -e "Le fichier de configuration de SSH n'existe pas. \nLe script va s'arrêter. Veuillez vérifier que OpenSSH a bien été installé."
            exit 1
    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
    sudo /etc/init.d/ssh restart
     
    clear
    echo "----------------------------
    2- Authentification par clés
    ----------------------------
     
    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."
     
    reponse=""
    until [[ ${reponse} =~ ^[OoNn]$ ]]; do
       echo "Souhaitez-vous mettre en place une authentification par clés ?(O/N)?"
       read reponse
    done
     
    case "$reponse" in
         [Oo]) 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."
           reponse=""
           until [[ ${reponse} =~ ^[OoNn]$ ]]; do
               echo "Souhaitez-vous générer de nouvelles clés ? (O/N)"
               read reponse
           done
           case "$reponse" in
               [Oo]) 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" >> "$FICHIER_CLES"
    		         echo "<p>La clé publique a été enregistrée sur ce PC. Vous devrez transférer votre clé privée <b>$DOSSIER_SSH$nom_cle</b> sur le poste client et <b>l'effacer</b> de ce PC pour des raisons de sécurité.</p>" >> $fichier_notice
    		         ;;
    		   [!Oo]) 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     
    		          ;;
          esac
    	  echo -e "\nVoulez-vous interdire l'authentification par mot de passe ?(O/N) \nSi vous ne l'interdisez pas, n'importe qui disposant de votre nom \nd'utilisateur et de votre mot de passe pourra se connecter depuis Internet."
          reponse=""
          until [[ ${reponse} =~ ^[OoNn]$ ]]; do
              read reponse
          done
          case "$reponse" in
              [Oo]) sudo sed -i -e "s/PasswordAuthentication.*$/PasswordAuthentication no/g" "$SSH_CONF"
    		        sudo sed -i -e "s/UsePAM.*$/UsePAM no/g" "$SSH_CONF"
    		        ;;
           esac
    	 ;;
    esac
     
    clear
    echo "#########################################################    
     
                        CONFIGURATION DE VNC
     
    #########################################################
     
    ---------------------------
    1- Configuration du serveur
    ---------------------------
     
    Souhaitez-vous que le serveur VNC démarre automatiquement à l'ouverture
    de la session de l'utilisateur courant ?(O/N)
    A défaut, vous devrez le lancer manuellement à partir d'une session SSH."
    reponse=""
    until [[ ${reponse} =~ ^[OoNn]$ ]]; do
        read reponse
    done
    echo "<h2>Configuration VNC</h2>" >> $fichier_notice
     
    case "$reponse" in
       [Oo])  echo -e "[Desktop Entry]\nType=Application\nName=x11vnc\nExec=x11vnc -localhost -many" > "$AUTOSTART_VNC"
    	      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
              ;;
       [!Oo]) 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
              ;;
    esac 
     
    ##################################################################################
    # 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 " (le chemin d'accès à la clé privée est à adapter):<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>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 --> TunnelsChamp</b><br/>Source port * * <b>L5900</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
     
    clear
    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.
    "
    reponse=""
    until [[ ${reponse} =~ ^[OoNn]$ ]]; do
        echo "Désirez-vous l'ouvrir maintenant ? (O/N)"
        read reponse
    done
     
    case "$reponse" in
       [Oo]) xdg-open "$fichier_notice" &
    esac 
     
    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.

  2. #2
    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
    Bonjour,

    c'est bien. cependant :

    ne faudrait-il pas vérifier que apt-get et X11 sont installés dès le début du script ?

    > notice.html il n'est pas indispensable de créer un fichier avant d'écrire dedans.
    ce fichier sera créé dans le répertoire où est l'utilisateur, ce n'est pas forcément ~.
    si le fichier existe déjà, il va être supprimé pour être réécrit.
    il y a peut-être d'autres fichiers notice.html, le nom du votre devrait contenir une description de son propos (le nom du script ?).
    pourquoi ne pas utiliser tout de suite $fichier_notice ?

    donc, à la place,
    - tester que le fichier existe
    - vérifier qu'il est différent de la version contenue dans le script
    ...

    mais, d'ailleurs, pourquoi du HTML, en devant recourir à X (alors que le script ne sera pas forcément exécuté dans X !) et à un navigateur ?
    l'affichage de l'aide dans le même contexte que l'exécution du script (le terminal) serait préférable.
    et dans ce cas, pourquoi enregistrer le fichier ?

    si tu donnes le chemin complet vers ifconfig, il devrait afficher les informations requises sans appeler sudo.

    if ! dpkg : tu pourrais faire un boucle for pour ne avoir à réécrire les même instructions.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    apt-get update
    for reqProg in openssh x11vnc; do dpkg -l | grep -q "$reqprog" || apt-get install "$reqProgs"; done
    selon moi, quand un script fait plus d'un appel à sudo, il devrait être exécuté par root.
    d'ailleurs, comment sais-tu que l'utilisateur est sudoer ?

    NB: les noms de variables tout en majuscules sont réservés aux variables d'environnement.

    tout ça, tout ça, et probablement plus. :/
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    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 tes remarques N_BaH,

    je vais faire les corrections nécessaires tenant compte des problèmes que tu soulèves et reposterai dès que possible une nouvelle version.

    Concernant X11 et le choix du HTML: l'accès VNC n'a d'intérêt que pour une prise de contrôle graphique. Ce script ne servira donc que pour des installations ayant X11 installé.
    HTML a été choisi parce qu'il permet un affichage formaté et propre, facile à lire pour un non spécialiste. Le fichier créé a vocation a être déplacé ensuite sur le poste client pour faciliter les opérations à faire sur celui-ci, par copier-coller par exemple. D'où son enregistrement.

    Je ne sais pas comment interpréter
    tout ça, tout ça, et probablement plus. :/
    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. #4
    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
    est-ce pour autant que l'installation se fera dans une session X11 ?

    tout ça, tout ça, et probablement plus. :/
    parce que je n'ai pas fini de lire le script
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    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
    est-ce pour autant que l'installation se fera dans une session X11 ?
    Dans le projet que je réalise, ça se fera dans une session X.
    Mais quitte à construire un script pour un projet précis, j'ai pensé qu'en prenant la peine de le généraliser un minimum au-delà de mon seul projet, il pourrait être utile à d'autres.
    Je vais donc essayer d'en tenir compte.

    Citation Envoyé par N_BaH Voir le message
    parce que je n'ai pas fini de lire le script
    Ah, ok ! Prends tout ton temps ! C'est déjà très sympa de ta part d'avoir bien voulu y consacrer de ton 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.

  6. #6
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Je trouve ça injustifié d'écrire autant de code qui est blindé de variables en dur. Ansible te permettrait d'avoir des templates(plus de code html dans ton script) et mettre toutes tes variables dans un fichier.

    A mes yeux, ton script n'est pas pratique en terme de maintenabilité/clareté/évolutivité/immuabilité.

    • Que se passe-t-il si on a déjà exécuté le script mais qu'on le relance ? on redémarre tous les services alors qu'on ne change rien à leur configuration ?
    • Est-ce qu'on a besoin d'apt-get update plusieurs fois de suite ? Si on l'a fait une fois, les fois suivantes sont inutiles, non ?
    • Gestion de logs ?
    • pas d'option par défaut pour les question posées ?
    • pourquoi les clears ? comme j'ai pas de logs, j'aimerais pouvoir au moins conserver l'éxecution pour pouvoir me plaindre au dev si j'ai un bug.
    • pas de exit 1 ? ça n'échoue jamais.
    • si je lance plusieurs fois en parallèle le script, est-ce que ça pose souci ? pas de gestion de /var/run/pid ?
    • Quel utilisateur doit lancer ce script ? Est-on sûr qu'il dispose des droits sudo ?
    • Quelle architecture linux cible-t-on ? ça fait quoi si je le lance sur une red hat ?
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  7. #7
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    Lors du test de la présence des paquets openssh-server et x11vnc, on peut éviter de faire traiter par grep la liste entière de tous les paquets installés. En reprenant le code de N_BaH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    apt-get update
    for reqProg in openssh-server x11vnc; do dpkg -s "$reqprog" >/dev/null 2>&1 || apt-get install "$reqProgs"; done
    @ggnore
    openssh-server n'est il pas un pré-requis pour Ansible, aussi bien sur les controlling servers que sur les controlled nodes ?
    IMHO, you should RTFM ASAP. IHTH.

  8. #8
    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 ce qui concerne l'architecture Linux, il est précisé dans le post de présentation que c'est destiné aux distributions de la famille Debian.

    Je précise que je ne suis ni informaticien ni développeur de profession. Simple autodidacte dans le domaine de l'informatique, depuis... très longtemps. Le temps ne suffit pas à faire de moi un expert, et j'ai bien conscience de mes limites. En faisant ce script pour mon projet, j'ai pensé qu'il pourrait être utile à d'autres, sans l'ambition d'en faire un outil "professionnel", ce dont je serais bien incapable.

    La rubrique consacrée aux propositions de scripts bash sur Developpez comporte une seule source... ç'aurait pu être l'occasion de tenter de l'enrichir.

    Aussi dites-moi en toute sincérité si ce script présente ou non un intérêt pouvant justifier sa publication sur Developpez. Il pourra sans problème rester à l'état d'outil circonscrit à mon projet ! Les remarques faites me seront déjà très utiles.
    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. #9
    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
    1. Ton script comprend 51 lignes qui finissent pas des espaces. Est-ce bien utile?

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $ grep -c -e ' $' test.sh
      51
    2. De plus, l'indentation comprend un mélange de tabulations et d'espaces, ce qui fait qu'il n'apparaît pas correctement indenté ni sur le site, ni lorsqu'il est affiché avec un éditeur paramétré différemment du tien.

    3. Effectivement, l'usage des "clear" me paraît gênant car on perd les traces de ce qui vient d'être fait.

    4. À la ligne 106, il vaudrait mieux mettre la variable entre guillemets (comme tu as fait partout ailleurs), au cas (improbable, j'avoue) où le chemin comprendrait des espaces:

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if ! [ -e "$SSH_CONF" ]
    5. La vérification de réponse oui/non revient souvent. Pour factoriser le code, tu pourrais en faire une fonction qui, de plus, améliorerait considérablement la lisibilité. Par exemple:
      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
       
      oui_ou_non() {
          question=$1
          reponse=""
          until [[ ${reponse} =~ ^[OoNn]$ ]]; do
              echo "$question (O/N) ?"
              read reponse
          done
          case "$reponse" in
              [Oo]) return 0 ;;
              *) return 1
          esac
      }
       
      echo "Test positif de oui_ou_non"
      if oui_ou_non "Voulez-vous choisir votre réponse"
      then echo "vous avez choisi oui"
      else echo "vous avez choisi non"
      fi
       
      echo ''
       
      echo "Test négatif de oui_ou_non"
      if ! oui_ou_non "Voulez-vous choisir votre réponse"
      then echo "vous avez choisi non"
      else echo "vous avez choisi oui"
      fi

  10. #10
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Citation Envoyé par RaphaelG Voir le message
    @ggnore
    openssh-server n'est il pas un pré-requis pour Ansible, aussi bien sur les controlling servers que sur les controlled nodes ?
    Tu as raison, j'ai généralisé mon cas personnel sans réfléchir.

    @op Désolé de ma façon de répondre qui me parait désagréable maintenant. C'est très bien de vouloir scripter. Essaie de lire des scripts existants et de te demander pourquoi et comment ils font. ça pourrait t'inspirer.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  11. #11
    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 ggnore Voir le message
    T@op Désolé de ma façon de répondre qui me parait désagréable maintenant. C'est très bien de vouloir scripter. Essaie de lire des scripts existants et de te demander pourquoi et comment ils font. ça pourrait t'inspirer.
    A partir du moment où on demande des avis pour proposer quelque chose publiquement, il nous faut accepter la critique, aussi crûe soit-elle !

    Ma question sur l'intérêt ou non de publier ce script dans les sources de Developpez n'était pas liée au fait d'avoir mal pris les choses, mais répond à une interrogation réelle.
    Pour accepter que quelque chose soit publié (article, tutoriel, source, etc.) il faut nécessairement placer quelque part un curseur :
    - si le curseur est à un niveau trop élevé, le risque est que personne ne publie, chacun craignant de ne pas être suffisamment expert;
    - si le curseur est trop bas, c'est la crédibilité du site qui est en cause.

    Il appartient aux experts du domaine concerné de dire, en toute sincérité, si ce qui est proposé est ou non suffisamment digne d'intérêt en fonction du public fréquentant le site.
    Sans doute faut-il toutefois faire attention à la forme pour ne pas décourager de bonnes volontés ! (je ne dis pas ça pour toi, je soulève le problème sur un plan général)
    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. #12
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Si tu veux des scripts et des critiques :
    https://www.developpez.net/forums/d2...scripts-shell/
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  13. #13
    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 ggnore Voir le message
    Si tu veux des scripts et des critiques :
    https://www.developpez.net/forums/d2...scripts-shell/
    Merci pour ce lien.
    Il me fait m'interroger sur la raison de la pauvreté de la rubrique sources consacrée aux scripts shell alors qu'il y a de nombreux contributeurs.
    Quelqu'un a-t-il une explication ?
    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. #14
    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
    J'avance dans les corrections du script:

    • 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



    Mais une version plus aboutie va demander un peu de temps, car il y a un certain nombres de problèmes à résoudre:

    • pour le problème justement évoqué de l'utilisation de sudo, j'envisage d'imposer le lancement du script avec des droits root, mais cela nécessite de pouvoir démarrer automatiquement x11vnc en tant que service et non comme application seulement
    • en testant sur une installation fraîche de Debian 9, je me suis aperçu que ifconfig est déprécié, remplacé, semble-t-il, par ip (ifconfig n'existe plus). Il me faut donc creuser le problème pour pouvoir extraire les informations de réseau, que la machine soit récente ou ancienne (depuis quand ip est-il présent ? Est-il souhaitable d'installer le paquet net-tools pour avoir ifconfig si celui-ci est déprécié ?). Si vous avez des infos et avis à ce sujet !!
    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.

  15. #15
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    Ca fait un bail que ip est devenu à la mode et remplace ifconfig et route. c'était déjà vrai avec Wheezy (Debian 7) peut être même dans des versions encore antérieures.
    C'est la même chose avec Red Hat. Je crois bien que sur tous les linux, la commande ip apportée par le paquet iproute2 remplace les traditionnelles commandes ifconfig et route.
    Tu as donc tout intérêt d'utiliser ip dans ton script plutôt qu'ifconfig.
    Par contre ifconfig reste l'outil préférentiel sur des unix non linux tel que Solaris par exemple. Je me demande bien ce qu'il en est avec BSD ?
    Sinon, je te recommande aussi de tester le retour des "apt-get install" parce que l'installation d'un paquet n'est pas une opération si anodine et qu'il y a moult raisons que cela ne se passe pas bien.
    IMHO, you should RTFM ASAP. IHTH.

  16. #16
    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 RaphaelG Voir le message
    Tu as donc tout intérêt d'utiliser ip dans ton script plutôt qu'ifconfig.
    Par contre ifconfig reste l'outil préférentiel sur des unix non linux tel que Solaris par exemple. Je me demande bien ce qu'il en est avec BSD ?
    En tout cas, sous macos (qui est assez proche de BSD), il n'y a pas de commande "ip", mais une commande "ifconfig".

    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
    man ip
    IP(4)                    BSD Kernel Interfaces Manual                    IP(4)
     
    NAME
         ip -- Internet Protocol
     
    SYNOPSIS
         #include <sys/socket.h>
         #include <netinet/in.h>
     
         int
         socket(AF_INET, SOCK_RAW, proto);
     
    DESCRIPTION
         IP is the transport layer protocol used by the Internet protocol family.  Options may be set at the IP level when using higher-level protocols that are based on IP (such as TCP and UDP).  It may also be accessed through a
         ``raw socket'' when developing new protocols, or special-purpose applications.
    ...
    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
    man ifconfig
    IFCONFIG(8)               BSD System Manager's Manual              IFCONFIG(8)
     
    NAME
         ifconfig -- configure network interface parameters
     
    SYNOPSIS
         ifconfig [-L] [-m] [-r] interface [create] [address_family] [address [dest_address]] [parameters]
         ifconfig interface destroy
         ifconfig -a [-L] [-d] [-m] [-r] [-u] [-v] [address_family]
         ifconfig -l [-d] [-u] [address_family]
         ifconfig [-L] [-d] [-m] [-r] [-u] [-v] [-C]
         ifconfig interface vlan vlan-tag vlandev iface
         ifconfig interface -vlandev iface
         ifconfig interface bonddev iface
         ifconfig interface -bonddev iface
         ifconfig interface bondmode lacp | static
     
    DESCRIPTION
         The ifconfig utility is used to assign an address to a network interface and/or configure network interface parameters.

  17. #17
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 453
    Points : 43 108
    Points
    43 108
    Par défaut
    Est-il souhaitable d'installer le paquet net-tools pour avoir ifconfig
    Oui si tu veux la rétrocompatibilité, ou tu le fais dans l'autre sens : tu vérifies la présence d'ipconfig.

    Je n'ai pas d'ipconfig sous version Debian 7 (installation net install). J'ai pas d'autres distris sous le coude pour regarder.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  18. #18
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Tu pourrais envisager de détecter l'os avec uname puis de vérifier toutes tes dépendances en fonction de ce que tu as trouvé. A toi de voir si tu veux couvrir tous les linux du monde
    C'est là qu'un joli hash pourrait t'aider. On peut en bash, mais pour les scripts un peu dodus, je trouve ça une plaie à débugger. Bash n'est pas assez regardant de la variable et il est facile de faire des erreurs. Du python, perl ou utiliser ansible me paraissent bien plus robuste pour ne pas réinventer la roue et être efficace lors de la rédaction de tes scripts.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  19. #19
    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,
    Citation Envoyé par chrtophe Voir le message
    Je n'ai pas d'ipconfig sous version Debian 7 (installation net install). J'ai pas d'autres distris sous le coude pour regarder.
    En même temps, ipconfig c'est sous Windows, donc…

    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

    Pour le choix du port de SSH et la boucle sur le tableau (for port in ${ports_reserves[*]}; do), un simple grep -w -F "${port_demande}" <<<"${ports_reserves}" (en déclarant "ports_reserve" comme une variable et non comme un tableau) et un test du retour ($?) devrait être plus simple et plus rapide.

    $ man woman
    Il n'y a pas de page de manuel pour woman.

  20. #20
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 453
    Points : 43 108
    Points
    43 108
    Par défaut
    +1 pour la vanne.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/11/2009, 18h12
  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, 15h16
  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, 17h35
  4. Réponses: 0
    Dernier message: 14/03/2008, 22h33

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