Créer des scripts d'administration simples

ShellBeginner
Pratiquer maintenant

Introduction

Les administrateurs transforment souvent les vérifications répétitives en petits scripts shell. Le scripting de style RHCSA ne consiste pas à écrire de gros programmes, mais à utiliser Bash de manière suffisamment sécurisée pour automatiser les tâches courantes, valider les entrées, parcourir des cibles, renvoyer des codes de sortie utiles et générer des sorties compréhensibles par d'autres administrateurs.

Dans ce laboratoire, vous allez construire un script de résumé de répertoire étape par étape. Le script acceptera des chemins de répertoires, vérifiera si chaque chemin est utilisable, collectera des informations de base sur les fichiers, écrira une sortie lisible et enregistrera cette même sortie dans un fichier journal.

Créer un script exécutable

Dans cette étape, vous allez inspecter les répertoires d'exemple et créer la première version exécutable d'un script d'administration. Un script doit commencer par un shebang afin que le système sache quel interpréteur utiliser.

Déplacez-vous dans le répertoire du projet.

cd /home/labex/project

Inspectez l'arborescence d'exemple. La commande find liste les fichiers et les répertoires, et sort permet d'obtenir un ordre stable.

find /home/labex/project/script-practice -maxdepth 2 -print | sort

Créez la première version de admin-summary.sh. La ligne #!/bin/bash indique à Linux d'exécuter le fichier avec Bash. L'option set -u fait échouer le script s'il utilise une variable non définie, ce qui permet de détecter de nombreuses erreurs de frappe.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"
EOF

Rendez le script exécutable. Sans autorisation d'exécution, le fichier n'est que du texte.

chmod 755 /home/labex/project/admin-summary.sh

Exécutez le script.

/home/labex/project/admin-summary.sh

Vous devriez voir le titre du script, l'utilisateur actuel et le nom d'hôte court. Le nom d'hôte exact peut varier.

Accepter des arguments de répertoire

Dans cette étape, vous allez ajouter des paramètres positionnels. Un script utilise $# pour compter les arguments et "$@" pour représenter tous les arguments exactement tels qu'ils ont été transmis.

Remplacez le script par une version qui nécessite au moins un argument de répertoire.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

if [ "$#" -eq 0 ]; then
  echo "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"

for target in "$@"; do
  echo "TARGET=$target"
done
EOF

Gardez le script exécutable.

chmod 755 /home/labex/project/admin-summary.sh

Exécutez-le sans argument. La commande doit afficher le texte d'utilisation et renvoyer le code de sortie 2. L'opérateur || exécute la commande de droite uniquement lorsque le script de gauche échoue, ce qui vous permet d'afficher intentionnellement le statut non nul.

/home/labex/project/admin-summary.sh || echo "exit status: $?"

Exécutez-le maintenant avec deux arguments de répertoire.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs

La sortie doit inclure une ligne TARGET= pour chaque argument.

Tester chaque cible et renvoyer un statut utile

Dans cette étape, vous allez ajouter un test conditionnel pour chaque argument. Le test [ -d "$target" ] ne réussit que si le chemin existe et qu'il s'agit d'un répertoire.

Remplacez le script par une version qui signale OK pour les répertoires et MISSING pour tout le reste.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

if [ "$#" -eq 0 ]; then
  echo "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"

exit_status=0

for target in "$@"; do
  if [ -d "$target" ]; then
    echo "OK $target"
  else
    echo "MISSING $target"
    exit_status=1
  fi
done

exit "$exit_status"
EOF

Exécutez le script avec un répertoire valide. Le code de sortie final doit être 0.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app
echo "exit status: $?"

Exécutez-le à nouveau avec un répertoire manquant. Cette fois, le script doit afficher MISSING et renvoyer le code de sortie 1.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/missing || echo "exit status: $?"

Collecter des faits pratiques sur les répertoires

Dans cette étape, vous allez ajouter la substitution de commande. La substitution de commande exécute une commande à l'intérieur de $() et stocke sa sortie dans une variable.

Remplacez le script par une version qui signale le nombre de fichiers, la taille apparente et le propriétaire pour chaque répertoire valide.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

if [ "$#" -eq 0 ]; then
  echo "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"

exit_status=0

for target in "$@"; do
  if [ -d "$target" ]; then
    file_count="$(find "$target" -type f | wc -l)"
    size="$(du -sh "$target" | awk '{print $1}')"
    owner="$(stat -c '%U:%G' "$target")"
    echo "OK $target FILES=$file_count SIZE=$size OWNER=$owner"
  else
    echo "MISSING $target"
    exit_status=1
  fi
done

exit "$exit_status"
EOF

Exécutez le script sur les trois répertoires préparés.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs /home/labex/project/script-practice/cache

Le répertoire app devrait afficher FILES=3, logs devrait afficher FILES=2, et cache devrait afficher FILES=1.

Enregistrer la sortie dans un fichier journal

Dans cette étape, vous allez ajouter une petite fonction d'assistance et un fichier journal. Une fonction évite la répétition de code, et tee -a affiche la sortie tout en ajoutant la même ligne à un fichier.

Remplacez le script par la version finale.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

LOG="/home/labex/project/admin-summary.log"
: > "$LOG"

emit() {
  echo "$*" | tee -a "$LOG"
}

if [ "$#" -eq 0 ]; then
  emit "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

emit "RHCSA admin summary"
emit "RUN_AS=$(id -un)"
emit "HOST=$(hostname -s)"

exit_status=0

for target in "$@"; do
  if [ -d "$target" ]; then
    file_count="$(find "$target" -type f | wc -l)"
    size="$(du -sh "$target" | awk '{print $1}')"
    owner="$(stat -c '%U:%G' "$target")"
    emit "OK $target FILES=$file_count SIZE=$size OWNER=$owner"
  else
    emit "MISSING $target"
    exit_status=1
  fi
done

exit "$exit_status"
EOF

Exécutez le script final avec deux répertoires valides et un répertoire manquant.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs /home/labex/project/script-practice/missing || echo "exit status: $?"

Inspectez le journal enregistré.

sed -n '1,8p' /home/labex/project/admin-summary.log

La sortie du terminal et le fichier journal doivent contenir les mêmes lignes de résumé. Comme une cible est manquante, le code de sortie doit être 1.

Résumé

Vous avez créé un script d'administration Bash pratique. Vous avez utilisé un shebang, des autorisations d'exécution, des paramètres positionnels, des comptes d'arguments, des boucles, des tests de répertoire, la substitution de commande, des codes de sortie explicites, une fonction d'assistance et un fichier journal. Ce sont les modèles de script les plus utiles pour les petites tâches d'administration de style RHCSA.