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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    892
    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 : 892
    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 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    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
    892
    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 : 892
    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 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    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
    892
    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 : 892
    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 : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    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
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    892
    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 : 892
    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.

  8. #8
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    892
    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 : 892
    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.

  9. #9
    Membre chevronné
    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
    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.

  10. #10
    Rédacteur


    Homme Profil pro
    Instituteur retraité
    Inscrit en
    Novembre 2015
    Messages
    892
    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 : 892
    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.

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