Créer un utilitaire bash pour Debian

2016-03-11

linux Hadock 2016-03-11

 

L’exercice était de créer un utilitaire pour gérer certaines choses sur Debian, via un fichier “.sh”.

Lors du codage de ce fichier “.sh” je me suis vu confronté à certaines problématiques que je vais énumérer en dessous, puis par la suite je présenterai mon script.

 

1ère problématique :

Toute simple, elle m'a quand même fait chercher pendant un certain temps : afficher en colonne la commande suivante ->

cat /etc/passwd | awk -F: ‘{print $ 1}’

La solution la plus simple est “d’enfermer” notre commande dans un “echo”.

Je m’explique, le shell va prendre le résultat de la commande et passer des ‘mots’ à echo.

Les mots sont séparés par des caractères blancs (espace, tabulation, saut de ligne).

Quand à echo, il affiche chaque argument (donc chaque mot) séparé par un espace.

Au final, toutes les suites de caractères blancs seront remplacées par un seul espace!

 

Ce qui donne :

echo $(ma_commande)

donc pour ma problématique

echo $(cat /etc/passwd | awk -F: ‘{print $ 1}’)

La solution la plus compliquée (si on peut dire) permettra d’effectuer une “mise en page”, il s’agit de xargs.

Il nous suffira de taper :

“commande | xargs -d’ ’ echo”

2ème problématique :

Moins simple car pour la résoudre j’ai du me mesurer au piquant des loop sur linux...

Je voulais que lorsque l’utilisateur effectue une commande dans mon tableau des choix celle-ci se voit exécutée puis que l’utilisateur n’ait plus qu’à appuyer sur une touche pour revenir au menu.

La solution :

i=0
while [ $i -le 10 ]
do
MON MENU
done

 

Dans cette commande je définis que i=0, ensuite je définis que si i est supérieur a 10 alors la boucle se termine.

 

Entre do et done je place mon code a afficher.

 

A noter que dans les options de mon tableau il faudra que je rajoute : echo $i

Exemple :

chome () {
dir -r /home
echo $i
}

 

dans cette commande echo $i me sert a appeler la variable i définie plus haut donc i sera toujours égale a 0, ainsi la boucle sera toujours en marche tant que nous appellerons la variable i.

 

 

Place au fichier maintenant.

Le code :

#!/bin/bash
clear
# =============================================
# | Notes |
# =============================================
# read #pause
# echo -e “fin et début?” #couleur dans un texte
# affichage users
# cat /etc/passwd | awk -F: ‘{print $1}’
# affichage groups
# cat /etc/group | awk -F: ‘{print $1}’
# affichage home
# ls /home
# add users
# adduser xx
# del users
# deluser xx
i=0
while [ $i -le 10 ]
do
# =============================================
# | Début code |
# =============================================
# ================[Etiquettes]=================
cadd () {
echo -n “Entrée le nom d’utilisateur a crée :”
read nomplus
adduser $nomplus
echo $i
}
cdel () {
echo -n “Entrée le nom d’utilisateur a supprimer (ceci supprimera aussi sont dossier!) :”
read nommoins
deluser $nommoins
rm -r /home/$nommoins
echo $i
}
chome () {
dir -r /home
echo $i
}
cviewuser () {
echo $(cat /etc/passwd | awk -F: ‘{print $1}’)
echo $i
}
cviewgroup () {
echo $(cat /etc/group | awk -F: ‘{print $1}’)
echo $i
}
# ===================[Menu]====================
echo ==========================================
echo —————–Bienvenue————
echo ==========================================
(echo ; echo -e “Ajouter un utilisateur[1]:Supprimer un utilisateur[2]: Lire le fichier home[3]:Afficher les utilisateurs[4]: Afficher les groupes[5]”) | column -t -s “:”
echo -n “Votre réponse :”; read reponse
# =================[Option if]=================
if [ $reponse = “1” ]; then
cadd
fi
if [ $reponse = “2” ]; then
cdel
fi
if [ $reponse = “3” ]; then
chome
fi
if [ $reponse = “4” ]; then
cviewuser
fi
if [ $reponse = “5” ]; then
cviewgroup
fi
done
# =============================================
# | Fin code |
# =============================================

 

Ici plusieurs commandes peuvent retenir votre attention; je ne vais en expliquer que quelques-unes.

 

 

#!/bin/bash

me sert a appeler les fichier servant au fonctionnement des commandes sous linux.

clear

me permet de “laver” la console de toute ligne de code pour afficher le reste du script sur une console “vide”.

i=0 while [ $i -le 10 ] do

Je ne réexpliquerai pas.

 

Les étiquettes :

cadd () {
echo -n “Entrée le nom d’utilisateur a crée :”
read nomplus
adduser $nomplus
echo $i
}

 

Dans cette exemple nous appelons l’étiquette “cadd” pour lancer le code qui ce trouve entre {}.

 

Le -n me permet d’afficher le curseur au niveau de la ligne sans faire de retour chariot.

Le “read” est la pour lire la variable “nomplus” que l’utilisateur va rentrer, variable qui est récupérée plus bas par “adduser $nomplus” qui me permet de rajouter un utilisateur de la même valeur que la variable (par exemple un nom).

 

Pour utiliser les étiquettes nous devons les appeler par le moyen suivant :

echo -n “Votre réponse :”; read reponse

puis

if [ $reponse = “1” ]; then cadd
fi
if [ $reponse = “2” ]; then cdel
fi

 

Ici nous demandons à l’utilisateur de rentrer son choix grâce a “read reponse” (“reponse” étant le nom de la variable) nous définissons grâce a “if” que si la variable est égale a 1 alors il faut appeler (avec then) l’étiquette cadd, mais si elle est égale a 2 alors il faudra appeler “cdel”.

 

Il est important de prendre en compte que les étiquettes devront se trouver absolument tout le temps en début de code avant d’être appelées (le code étant lu de haut en bas).

 

De plus ma méthode choisie pour afficher le menu est trop compliquée, en effet elle aurait pu être saisie grâce a écho.

Par exemple :

echo “==============”
echo “| choix1  || choix2 |”
echo “|_______||_______|”
echo “| choix3  || choix4 |”
echo “|_______||_______|”

 

 

 

Ce qui permet en plus de pouvoir faire un menu “stylisé” plus facilement.