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 :

    script mystère
    #!/bin/bash
    
    print_section() {
        echo
        echo "===== $1 ====="
    }
    
    check_command() {
        command -v "$1" >/dev/null 2>&1
    }
    
    network_interfaces() {
        print_section "Interfaces réseau"
        ip -br addr
    }
    
    default_gateway() {
        print_section "Passerelle par défaut"
        ip route | grep default
    }
    
    dns_servers() {
        print_section "Serveurs DNS"
        grep nameserver /etc/resolv.conf
    }
    
    nm_status() {
        print_section "Statut NetworkManager"
        if check_command nmcli; then
            nmcli networking connectivity
        else
            echo "nmcli non disponible"
        fi
    }
    
    active_connections() {
        print_section "Connexions réseau"
        if check_command ss; then
            ss -tunap
        elif check_command netstat; then
            netstat -tunap
        else
            echo "Aucun utilitaire de réseau (ss/netstat) trouvé"
        fi
    }
    
    routing_table() {
        print_section "Table de routage"
        ip route
    }
    
    hardware_info() {
        print_section "Matériel réseau"
        if check_command lspci; then
            lspci | grep -i net
        else
            echo "lspci non disponible"
        fi
    }
    
    mac_addresses() {
        print_section "Adresses MAC"
        ip link | grep link/ether
    }
    
    host_info() {
        print_section "Informations Host"
        hostnamectl
    }
    
    ping_test() {
        print_section "Test de connectivité Internet"
        if ping -c 2 -W 1 8.8.8.8 >/dev/null 2>&1; then
            echo "Connexion Internet OK"
        else
            echo "Pas de connexion Internet vers 8.8.8.8"
        fi
    }
    
    main() {
        # Tableau de fonctions à exécuter
        functions=(
            network_interfaces
            default_gateway
            dns_servers
            nm_status
            active_connections
            routing_table
            hardware_info
            mac_addresses
            host_info
            ping_test
        )
    
        # Boucle sur chaque fonction et exécution
        for func in "${functions[@]}"; do
            $func
        done
    }
    
    main
  2. Comment nommeriez-vous ce script de façon à ce qu’on sache ce qu’il fait.

🞄  🞄  🞄