1ers scripts shell Linux

Cette activité vise à découvrir la programmation en script shell sous Linux.

Elle repose sur le document ressource Introduction aux scripts shell

✎ Travail n° 1 Généralités sur les scripts shell

Consulter le document Introduction aux scripts shell jusqu’au praragraphe intitulé “Composition de commandes”.

💻 Travail n° 2 Redirections

  1. Consulter Composition de commandes

  2. Créer un fichier now.sh qui comportera un shebang pour indiquer qu’il doit être interprété par le shell /bin/sh (→ généralement un lien symbolique vers bash dans Linux)

  3. Coder ce script pour qu’il affiche à l’écran l’heure courante sous la forme “Il est actuellement hh:mm:ss” (→ voir pages de manuel de echo et date).

    Tester ce script en l’exécutant avec ./now.sh après lui avoir donné les droits d’exécution

  4. Donner la commande à saisir pour rediriger la sortie standard de ce script un fichier out.txt

  5. Consulter la page de manuel de la commande tr et saisir la commande à exécuter pour afficher l’heure courante sous la forme “IL EST ACTUELLEMENT hh:mm:ss” (tout en majuscules) sans toucher au code du script.

    Le travail demandé consiste à fournir la sortie standard de now.sh à l’entrée de la commande tr pour qu’elle la convertisse en majuscules.

💻 Travail n° 3 Substitution de variables utilisateur et expression arithmétique

  1. Consulter Variables utilisateur et Expressions arithmétiques & bit-à-bit

  2. Créer un script info-bts.sh

  3. Définir dans ce script définir 6 variables initialisées avec les valeurs indiquées :

    • nomBtsCyber Informatique et ELectronique

    • acronymeBtsCIEL

    • option1IR

    • option2ER

    • effectifOption1 ← 18

    • effectifOption2 ← 16

  4. Afficher le message suivant dans lequel chaque portion de texte en gras italique représente la valeur d’une des variables du script et celui en jaune correspond à la somme des 2 variables effectifOption1 et effectifOption2

    Effectif total en bts Cyber Informatique et ELectronique (CIEL) : 33
    (IR -> 18 / ER -> 15)

💻 Travail n° 4 Substitution de variables d’environnement

  1. Consulter Variables d’environnement

  2. Exécuter la commande printenv

  3. Récupérer le nom des variables d’environnement contenant :

    • le nom d’utilisateur

    • le nom de la machine

    • le nom de l’OS

  4. Faire un script welcome.sh qui affiche le message :

    Bienvenue utilisateur <utilisateur> sur le système <os> de l’ordinateur <machine>

    en remplaçant <utilisateur>, <os> et <machine> par le contenu des variables d’environnement récupérées à l’étape précédente

  5. consulter la page de manuel de la commande export et particulièrement ses exemples puis créer 2 nouvelles variables d’environnement nommées BTS et OPTION_BTS auxquelles vous assignerez les valeurs “CIEL” et “IR”

    Des variables d’environnement définies de cette façon ne seront valables que dans le shell courant.

    Plusieurs manières existent pour les rendre persistantes (ex. : les définir dans le fichier ~/.profile)

  6. modifier le script pour afficher désormais le message

    Bienvenue utilisateur <utilisateur> du bts <bts> option <option> sur le système <os> de l’ordinateur <machine>

💻 Travail n° 5 Variables internes et boucles

  1. Consulter Variables internes et Exécution en boucle

  2. Sachant que dans bash la variable $@ représente la liste des argument fournis au script via la ligne de commande, faire un script my-add.sh qui affiche progressivement la somme de tous les arguments passés au script

    Résultat attendu
    pluton:~ # ./my-add.sh 1 2 3 4 5
    1
    3
    6
    10
    15

💻 Travail n° 6 Exécution conditionnelle

  1. Consulter Exécution conditionnelle et Combinaison de conditions

  2. Coder un script is-leap.sh qui prend en argument une année et affiche si celle-ci est une année bissextile ou non.

    Si aucun argument n’est fourni le script doit afficher un message qui informe l’utilisateur qu’il doit fournir une année lors de l’appel du script

    Une année bissextile est une année qui est soit divisible par 400 soit divisible par 4 et non par 100 ;

💻 Travail n° 7 Substitution de commande

  1. Reprendre le script précédent et le faire évoluer pour qu’il prenne en compte la date courante (→ commande date) pour déterminer si elle est bissextile ou non

  2. 🔥 Coder un script qui affiche la mémoire libre disponible sur la machine ainsi que le pourcentage d’utilisation de celle-ci.

    • La commande free ou le fichier /proc/meminfo fournissent tous les 2 les informations nécessaires

    • Dans le résultat de la commande free, used = total – free – buff/cache

💻 Travail n° 8 1er script d’administration

  1. Faire un script create-ciel-users.sh qui crée de manière automatique les comptes pour les étudiants de BTS CIEL dont les noms sont passés en argument

    Dans un premier temps, on présume que les noms d’utilisateurs passés au script représentent le nom des comptes

    Le script doit :

    1. Créer le groupe ciel s’il n’existe pas

    2. Créer chaque utilisateur pour qu’il fasse partie du groupe ciel (→ groupe “primaire”) et users (→ groupe “secondaire”)

    3. Créer le répertoire d’accueil de chaque utilisateur (→ /home/<user>) s’il n’existe pas

    4. Initialiser le mot de passe de chaque utilisateur avec le nom du compte suivi de '`#" et des 5 1ers chiffres du hash md5 (→ commande `md5sum) calculé sur la chaîne constitué du préfixe “LAB-” suivi du nom de l’utilisateur (→ technique du “salage”. Voir Salage (cryptographie) link^name)

    5. Modifier les droits du répertoire d’accueil pour qu’il soit uniquement traversable aux utilisateurs du groupe et inaccessible à tous les autres

    6. Créer dans chaque répertoire d’accueil un répertoire share qui soit lisible et traversable par tous les membres du groupe ciel et inaccessibles aux autres

    7. Créer dans chaque répertoire d’accueil un répertoire perso qui ne soit accessible qu’au propriétaire du compte

  2. Faire évoluer le script pour que les noms d’utilisateurs qui lui soient passés en argument soient composés d’un prénom et d’un nom (→ ex.: “Ragnar Lothbrok”) et que celui-ci construise un compte constitué de la 1ère lettre du prénom suivi du nom, le tout en minuscule (→ ex.: rlothbrok)

    • Pour récupérer les prénom et nom de l’utilisateur passé en argument dans 2 variables séparées, la commande cut peut être utile

    • On peut récupérer une portion du contenu d’une variable alphanumérique avec la syntaxe $<nom-variable>:<idx-first>:<idx-last>.

      Exemple : si ${dummy} contient “foobar” alors ${dummy:0:3} contiendra “foo”

    Exemple de résultat attendu :
    pluton:~ # ./create-ciel-users.sh 'John Doe' 'Gerard Manvussa'
    userName : John Doe
    Création du compte => login : "jdoe" / password : "jdoe#33fa1"
    userName : Gerard Manvussa
    Création du compte => login : "gmanvussa" / password : "gmanvussa#7c310"
    pluton:~ # ./create-ciel-users.sh 'John Doe' 'Gerard Manvussa'
    userName : John Doe
    WARNING : Utilisateur jdoe existant => abandon du script
    Bye !
    pluton:~ # tree -pug /home
    /home
    ├── [drwx--x--- gmanvussa ciel    ]  gmanvussa
    │   ├── [drwxr-xr-x gmanvussa ciel    ]  bin
    │   ├── [drwx------ gmanvussa ciel    ]  perso
    │   └── [drwxr-x--- gmanvussa ciel    ]  share
    └── [drwx--x--- jdoe     ciel    ]  jdoe
        ├── [drwxr-xr-x jdoe     ciel    ]  bin
        ├── [drwx------ jdoe     ciel    ]  perso
        └── [drwxr-x--- jdoe     ciel    ]  share
    
    8 directories, 0 files
    pluton:~ #

💻 Travail n° 9 Analyse d’un script

  1. Analyser le script suivant que l’on peut trouver sur le nano-ordinateur Raspberry Pi et dont le rôle est d’initialiser certaines options du système d’exploitation :

    firstrun.sh
    #!/bin/bash
    
    set +e
    
    CURRENT_HOSTNAME=`cat /etc/hostname | tr -d " \t\n\r"`
    NEW_HOSTNAME=`cat /boot/hostname | tr -d " \t\n\r"`
    if [ -f /usr/lib/raspberrypi-sys-mods/imager_custom ]; then
       /usr/lib/raspberrypi-sys-mods/imager_custom set_hostname $NEW_HOSTNAME
    else
       echo $NEW_HOSTNAME >/etc/hostname
       sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\t$NEW_HOSTNAME/g" /etc/hosts
    fi
    FIRSTUSER=`getent passwd 1000 | cut -d: -f1`
    FIRSTUSERHOME=`getent passwd 1000 | cut -d: -f6`
    if [ -f /usr/lib/raspberrypi-sys-mods/imager_custom ]; then
       /usr/lib/raspberrypi-sys-mods/imager_custom enable_ssh
    else
       systemctl enable ssh
    fi
    if [ -f /usr/lib/userconf-pi/userconf ]; then
       /usr/lib/userconf-pi/userconf 'pi' '$5$hWT/bRpU0o$1VhE.rvbNMCDhrSfU0fi8oPzBFUoEa4BxyrjGSaWcT6'
    else
       echo "$FIRSTUSER:"'$5$hWT/bRpU0o$1VhE.rvbNMCDhrSfU0fi8oPzBFUoEa4BxyrjGSaWcT6' | chpasswd -e
       if [ "$FIRSTUSER" != "pi" ]; then
          usermod -l "pi" "$FIRSTUSER"
          usermod -m -d "/home/pi" "pi"
          groupmod -n "pi" "$FIRSTUSER"
          if grep -q "^autologin-user=" /etc/lightdm/lightdm.conf ; then
             sed /etc/lightdm/lightdm.conf -i -e "s/^autologin-user=.*/autologin-user=pi/"
          fi
          if [ -f /etc/systemd/system/getty@tty1.service.d/autologin.conf ]; then
             sed /etc/systemd/system/getty@tty1.service.d/autologin.conf -i -e "s/$FIRSTUSER/pi/"
          fi
          if [ -f /etc/sudoers.d/010_pi-nopasswd ]; then
             sed -i "s/^$FIRSTUSER /pi /" /etc/sudoers.d/010_pi-nopasswd
          fi
       fi
    fi
    if [ -f /usr/lib/raspberrypi-sys-mods/imager_custom ]; then
       /usr/lib/raspberrypi-sys-mods/imager_custom set_keymap 'fr'
       /usr/lib/raspberrypi-sys-mods/imager_custom set_timezone 'Europe/Paris'
    else
       rm -f /etc/localtime
       echo "Europe/Paris" >/etc/timezone
       dpkg-reconfigure -f noninteractive tzdata
    cat >/etc/default/keyboard <<'KBEOF'
    XKBMODEL="pc105"
    XKBLAYOUT="fr"
    XKBVARIANT=""
    XKBOPTIONS=""
    
    KBEOF
       dpkg-reconfigure -f noninteractive keyboard-configuration
    fi
    rm -f /boot/firstrun.sh
    sed -i 's| systemd.run.*||g' /boot/cmdline.txt
    exit 0
  2. Indiquer ce que fait réellement ce script

🞄  🞄  🞄