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
-
Consulter Composition de commandes
-
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) -
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
etdate
).Tester ce script en l’exécutant avec
./now.sh
après lui avoir donné les droits d’exécution -
Donner la commande à saisir pour rediriger la sortie standard de ce script un fichier
out.txt
-
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 commandetr
pour qu’elle la convertisse en majuscules.
💻 Travail n° 3 Substitution de variables utilisateur et expression arithmétique
-
Consulter Variables utilisateur et Expressions arithmétiques & bit-à-bit
-
Créer un script
info-bts.sh
-
Définir dans ce script définir 6 variables initialisées avec les valeurs indiquées :
-
nomBts
←Cyber Informatique et ELectronique
-
acronymeBts
←CIEL
-
option1
←IR
-
option2
←ER
-
effectifOption1
← 18 -
effectifOption2
← 16
-
-
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
eteffectifOption2
Effectif total en bts Cyber Informatique et ELectronique (CIEL) : 33 (IR -> 18 / ER -> 15)
💻 Travail n° 4 Substitution de variables d’environnement
-
Consulter Variables d’environnement
-
Exécuter la commande
printenv
-
Récupérer le nom des variables d’environnement contenant :
-
le nom d’utilisateur
-
le nom de la machine
-
le nom de l’OS
-
-
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
-
consulter la page de manuel de la commande
export
et particulièrement ses exemples puis créer 2 nouvelles variables d’environnement nomméesBTS
etOPTION_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
) -
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
-
Consulter Variables internes et Exécution en boucle
-
Sachant que dans bash la variable
$@
représente la liste des argument fournis au script via la ligne de commande, faire un scriptmy-add.sh
qui affiche progressivement la somme de tous les arguments passés au scriptRésultat attendupluton:~ # ./my-add.sh 1 2 3 4 5 1 3 6 10 15
💻 Travail n° 6 Exécution conditionnelle
-
Consulter Exécution conditionnelle et Combinaison de conditions
-
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
-
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 -
🔥 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
-
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 argumentDans un premier temps, on présume que les noms d’utilisateurs passés au script représentent le nom des comptes
Le script doit :
-
Créer le groupe
ciel
s’il n’existe pas -
Créer chaque utilisateur pour qu’il fasse partie du groupe
ciel
(→ groupe “primaire”) etusers
(→ groupe “secondaire”) -
Créer le répertoire d’accueil de chaque utilisateur (→
/home/<user>
) s’il n’existe pas -
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)^name)
-
Modifier les droits du répertoire d’accueil pour qu’il soit uniquement traversable aux utilisateurs du groupe et inaccessible à tous les autres
-
Créer dans chaque répertoire d’accueil un répertoire
share
qui soit lisible et traversable par tous les membres du groupeciel
et inaccessibles aux autres -
Créer dans chaque répertoire d’accueil un répertoire
perso
qui ne soit accessible qu’au propriétaire du compte
-
-
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
-
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
-
Indiquer ce que fait réellement ce script
🞄 🞄 🞄