Introduction
Bienvenue dans ce guide complet sur les questions et réponses d'entretien Shell ! Que vous vous prépariez à un entretien, que vous cherchiez à affiner vos compétences actuelles ou que vous soyez simplement curieux de connaître l'étendue des connaissances en matière de shell, ce document est conçu pour être votre ressource ultime. Nous couvrons tout, des concepts fondamentaux et du scripting avancé à la résolution de problèmes basés sur des scénarios et aux défis spécifiques à un rôle, vous assurant ainsi d'être bien équipé pour toute discussion technique. Plongez pour explorer des tâches pratiques, des techniques de dépannage, des meilleures pratiques et des considérations de sécurité essentielles, vous permettant de démontrer avec confiance votre expertise en scripting Shell et votre maîtrise de la ligne de commande.

Concepts et commandes Shell fondamentaux
Quelle est la différence entre un lien physique (hard link) et un lien symbolique (soft link) ?
Réponse :
Un lien physique pointe directement vers l'inode d'un fichier, ce qui signifie qu'il s'agit d'une entrée de répertoire supplémentaire pour les mêmes données de fichier. Un lien symbolique (symlink) est un fichier spécial qui contient un chemin vers un autre fichier ou répertoire. Les liens physiques ne peuvent pas traverser les systèmes de fichiers et ne peuvent pas pointer vers des répertoires, tandis que les liens symboliques le peuvent.
Expliquez l'utilité de la variable d'environnement PATH.
Réponse :
La variable d'environnement PATH est une liste de répertoires séparés par des deux-points que le shell recherche pour trouver les commandes exécutables lorsqu'une commande est saisie sans son chemin complet. Cela permet aux utilisateurs d'exécuter des commandes comme ls ou grep sans avoir à spécifier /bin/ls ou /usr/bin/grep.
Comment rediriger la sortie standard (standard output) et l'erreur standard (standard error) vers des fichiers séparés ?
Réponse :
Vous pouvez rediriger la sortie standard (1) et l'erreur standard (2) vers des fichiers séparés en utilisant commande > sortie.txt 2> erreur.txt. Cela envoie la sortie réussie vers sortie.txt et les messages d'erreur vers erreur.txt.
Quelle est la différence entre les commandes exec et source (ou .) ?
Réponse :
exec remplace le processus shell actuel par la commande spécifiée, ce qui signifie que le shell d'origine est terminé. source (ou .) exécute un script dans l'environnement du shell actuel, ce qui signifie que toutes les variables ou fonctions définies dans le script font partie de l'environnement du shell actuel.
Décrivez la fonction de la commande grep et donnez un exemple de base.
Réponse :
grep (Global Regular Expression Print) est utilisé pour rechercher des motifs dans des fichiers texte. Il affiche les lignes qui correspondent à une expression régulière donnée. Par exemple, grep 'error' logfile.txt affichera toutes les lignes contenant le mot 'error' dans logfile.txt.
Comment trouver tous les fichiers de plus de 10 Mo dans le répertoire actuel et ses sous-répertoires ?
Réponse :
Vous pouvez utiliser la commande find : find . -type f -size +10M. Cette commande recherche dans le répertoire actuel (.) les fichiers (-type f) qui sont plus grands que (+) 10 mégaoctets (10M).
Expliquez le concept de "piping" (tube) dans le shell.
Réponse :
Le piping (|) est un mécanisme qui permet de connecter la sortie standard d'une commande à l'entrée standard d'une autre commande. Cela permet d'enchaîner plusieurs commandes pour effectuer des opérations complexes, où la sortie d'une commande devient l'entrée de la suivante.
Quelle est la signification du caractère ~ (tilde) dans le shell ?
Réponse :
Le caractère ~ (tilde) est une notation abrégée qui se développe en répertoire personnel de l'utilisateur actuel. Par exemple, cd ~/documents changera le répertoire pour le dossier documents dans le répertoire personnel de l'utilisateur.
Comment afficher le contenu d'un fichier compressé gzippé sans le décompresser ?
Réponse :
Vous pouvez utiliser la commande zcat. Par exemple, zcat file.gz affichera le contenu non compressé de file.gz sur la sortie standard sans créer de fichier décompressé sur le disque.
Quel est l'objectif de la commande chmod ?
Réponse :
chmod (change mode) est utilisé pour modifier les permissions des fichiers et des répertoires. Il contrôle qui peut lire, écrire ou exécuter un fichier. Les permissions peuvent être définies à l'aide de modes symboliques (par exemple, u+x) ou de notation octale (par exemple, 755).
Scripting et programmation avancés
Expliquez la différence entre 'source' et l'exécution directe d'un script (par exemple, './script.sh').
Réponse :
L'utilisation de source script.sh ou . script.sh exécute le script dans l'environnement du shell actuel, ce qui signifie que toutes les variables ou fonctions définies deviennent partie intégrante du shell courant. L'exécution directe (./script.sh) exécute le script dans un nouveau sous-shell, de sorte que les modifications apportées à l'environnement ne sont pas propagées au shell parent.
Comment gérer les erreurs et les codes de sortie dans un script shell ?
Réponse :
Les erreurs sont généralement gérées en vérifiant le statut de sortie des commandes à l'aide de $?. Un statut de sortie non nul indique une erreur. Vous pouvez utiliser set -e pour quitter immédiatement si une commande échoue, ou trap pour exécuter une commande lors de la sortie ou de signaux spécifiques.
Décrivez l'utilité de set -euxo pipefail au début d'un script.
Réponse :
set -e quitte immédiatement si une commande se termine avec un statut non nul. set -u traite les variables non définies comme des erreurs. set -x affiche les commandes et leurs arguments au fur et à mesure de leur exécution. set -o pipefail fait en sorte qu'un pipeline retourne le statut de sortie de la dernière commande qui a retourné un statut non nul, plutôt que seulement la dernière commande du pipeline.
Comment passer des arguments à un script shell et y accéder ?
Réponse :
Les arguments sont passés directement après le nom du script (par exemple, ./script.sh arg1 arg2). À l'intérieur du script, ils sont accessibles à l'aide de paramètres positionnels : $1 pour le premier argument, $2 pour le second, et ainsi de suite. $# donne le nombre total d'arguments, et $@ se développe en tous les arguments sous forme de mots séparés.
Expliquez le concept de "here documents" (documents ici) et donnez un exemple simple.
Réponse :
Un "here document" permet de fournir plusieurs lignes d'entrée à une commande comme si elles étaient tapées au clavier, sans créer de fichier temporaire. Il est délimité par << DELIMITER. Exemple : cat << EOF Hello World EOF.
Qu'est-ce qu'une commande trap et quand l'utiliseriez-vous ?
Réponse :
La commande trap vous permet d'exécuter une commande lorsque le shell reçoit un signal (par exemple, SIGINT pour Ctrl+C, SIGTERM pour la terminaison) ou lorsque le shell se termine. Elle est couramment utilisée pour les opérations de nettoyage, comme la suppression de fichiers temporaires, garantissant que les ressources sont libérées même si le script est interrompu.
Comment effectuer des opérations arithmétiques en Bash ?
Réponse :
Les opérations arithmétiques en Bash sont généralement effectuées à l'aide de ((...)) ou $[...]. Par exemple, result=$((5 + 3)) ou result=$[5 + 3]. La commande expr peut également être utilisée, mais elle est plus ancienne et moins efficace pour l'arithmétique entière simple.
Décrivez comment déboguer un script shell.
Réponse :
Le débogage peut être effectué en ajoutant set -x au début du script ou en exécutant bash -x script.sh. Cela affiche chaque commande avant son exécution. Vous pouvez également insérer des instructions echo pour afficher les valeurs des variables à différentes étapes de l'exécution.
Quelle est la différence entre [[ et [ pour les expressions conditionnelles ?
Réponse :
[[ est un mot-clé de Bash qui offre des fonctionnalités plus avancées que le [ conforme à POSIX (qui est une commande externe). [[ prend en charge la correspondance de motifs (=~), les opérateurs logiques (&&, ||), et évite la division de mots et l'expansion de noms de chemins, ce qui le rend plus sûr et plus puissant pour les tests de chaînes et de fichiers.
Comment écririez-vous une fonction en Bash et comment l'appelleriez-vous ?
Réponse :
Les fonctions sont définies en utilisant nom_fonction() { commandes; } ou function nom_fonction { commandes; }. Elles sont appelées en tapant simplement leur nom. Les arguments sont passés aux fonctions comme aux scripts, en utilisant des paramètres positionnels ($1, $2, etc.) dans la portée de la fonction. Exemple : ma_fonction() { echo $1; }; ma_fonction 'hello'.
Résolution de problèmes basés sur des scénarios
Vous devez trouver tous les fichiers de plus de 10 Mo dans le répertoire actuel et ses sous-répertoires, puis lister leurs chemins et tailles dans un format lisible par l'homme. Comment procéderiez-vous ?
Réponse :
Utilisez find . -type f -size +10M -exec du -h {} \;. find localise les fichiers, -type f spécifie les fichiers, -size +10M filtre par taille, et -exec du -h {} \; exécute du -h pour chaque fichier trouvé.
Un fichier journal /var/log/app.log grossit rapidement. Vous devez extraire toutes les lignes contenant le mot 'ERROR' des dernières 24 heures et les enregistrer dans un nouveau fichier errors_today.log. Supposons que les entrées du journal commencent par un horodatage.
Réponse :
Tout d'abord, déterminez l'horodatage d'il y a 24 heures. Ensuite, utilisez grep avec awk ou sed pour filtrer. Exemple : grep 'ERROR' /var/log/app.log | awk '$1 >= "$(date -d '24 hours ago' +'%Y-%m-%d')"' > errors_today.log. Une solution plus robuste pourrait impliquer logrotate ou journalctl si disponibles.
Vous avez un fichier CSV data.csv avec les colonnes Name,Age,City. Vous devez le trier par Age en ordre décroissant, puis par Name en ordre croissant, en affichant uniquement Name et City.
Réponse :
Utilisez sort avec cut et awk. (head -n 1 data.csv; tail -n +2 data.csv | sort -t',' -k2nr -k1n) pour trier. Ensuite, cut -d',' -f1,3 ou awk -F',' '{print $1 "," $3}' pour sélectionner les colonnes. En combinant : (head -n 1 data.csv; tail -n +2 data.csv | sort -t',' -k2nr -k1) | awk -F',' '{print $1 "," $3}'.
Un script myscript.sh s'exécute en arrière-plan, mais vous suspectez qu'il est bloqué. Comment vérifier son statut, et s'il ne répond pas, comment le terminer gracieusement, puis de force si nécessaire ?
Réponse :
Vérifiez le statut avec ps aux | grep myscript.sh. Pour une terminaison gracieuse, utilisez kill <PID>. S'il ne répond pas, utilisez kill -9 <PID> pour une terminaison forcée. Essayez toujours d'abord la terminaison gracieuse pour permettre le nettoyage.
Vous devez créer une sauvegarde du répertoire /etc, la compresser à l'aide de gzip, et la stocker dans /tmp/etc_backup_YYYYMMDD.tar.gz. Comment automatiser cela ?
Réponse :
Utilisez tar avec gzip. tar -czf /tmp/etc_backup_$(date +%Y%m%d).tar.gz /etc. Cette commande crée une archive tar gzippée (-c create, -z gzip, -f filename) avec un nom horodaté.
Vous dépannez un problème réseau. Comment vérifier si un port spécifique (par exemple, 8080) est ouvert et en écoute sur votre machine locale, et quel processus l'utilise ?
Réponse :
Utilisez netstat -tulnp | grep :8080 ou lsof -i :8080. netstat affiche les connexions réseau, -t TCP, -u UDP, -l listening (en écoute), -n numeric (numérique), -p process ID (identifiant du processus). lsof liste les fichiers ouverts, y compris les sockets réseau.
Vous devez télécharger un fichier depuis une URL (http://example.com/file.zip) et l'enregistrer sous le nom downloaded_file.zip dans le répertoire actuel. Comment procéder avec un outil en ligne de commande ?
Réponse :
Utilisez wget ou curl. Avec wget : wget -O downloaded_file.zip http://example.com/file.zip. Avec curl : curl -o downloaded_file.zip http://example.com/file.zip. Ces deux outils sont courants pour les téléchargements HTTP/HTTPS.
Vous avez un répertoire contenant de nombreux fichiers, et vous devez renommer tous les fichiers se terminant par .txt pour qu'ils se terminent par .log à la place. Comment réaliser cela ?
Réponse :
Utilisez une boucle for avec mv. for f in *.txt; do mv "$f" "${f%.txt}.log"; done. La syntaxe "${f%.txt}.log" supprime le suffixe .txt et ajoute .log.
Vous devez trouver les 5 plus gros fichiers dans le répertoire /var, en excluant les sous-répertoires comme /var/cache et /var/log.
Réponse :
Utilisez du et sort. du -ah --exclude=/var/cache --exclude=/var/log /var | sort -rh | head -n 5. du -ah liste les tailles dans un format lisible par l'homme, sort -rh trie numériquement en ordre inverse, et head -n 5 obtient les 5 premiers.
Un script doit s'exécuter tous les jours à 3 heures du matin. Comment planifier cette tâche ?
Réponse :
Utilisez cron. Ajoutez une entrée au crontab : 0 3 * * * /path/to/your/script.sh. Cela signifie à la minute 0, heure 3, tous les jours du mois, tous les mois, et tous les jours de la semaine, exécutez le script.
Questions spécifiques aux rôles (Développeur, Administrateur, DevOps)
Développeur : Comment débogueriez-vous un script shell qui échoue de manière intermittente sans messages d'erreur clairs ?
Réponse :
Je commencerais par ajouter set -x au début du script pour activer le traçage, qui affiche les commandes et leurs arguments au fur et à mesure de leur exécution. Pour un débogage plus ciblé, j'utiliserais des instructions echo pour afficher les valeurs des variables aux points critiques. La redirection de stderr vers un fichier (2> error.log) peut également aider à capturer les erreurs difficiles à cerner.
Développeur : Expliquez la différence entre $() et `` (guillemets inversés) pour la substitution de commande.
Réponse :
Les deux $() et ``(guillemets inversés) effectuent une substitution de commande, exécutant une commande et la remplaçant par sa sortie. Cependant,$() est généralement préféré car il permet l'imbrication sans échappement complexe et est plus lisible. Les guillemets inversés nécessitent d'échapper les guillemets inversés imbriqués, ce qui les rend plus difficiles à gérer.
Développeur : Écrivez un script shell pour trouver tous les fichiers de plus de 10 Mo dans un répertoire donné et ses sous-répertoires, puis listez-les par taille en ordre décroissant.
Réponse :
find /path/to/dir -type f -size +10M -print0 | xargs -0 du -h | sort -rh
Cette commande utilise find pour localiser les fichiers, xargs pour les passer à du pour le rapport de taille, et sort -rh pour trier par taille lisible par l'homme en ordre inverse.
Administrateur : Comment surveilleriez-vous l'utilisation de l'espace disque sur un serveur Linux et mettriez-vous en place une alerte si elle dépasse 90 % ?
Réponse :
J'utiliserais df -h pour vérifier l'espace disque. Pour automatiser les alertes, j'écrirais un script qui analyse la sortie de df, vérifie le pourcentage des partitions critiques, puis utilise mail ou une API de messagerie (comme un webhook Slack) pour envoyer une alerte si le seuil est franchi. Ce script serait planifié via cron.
Administrateur : Décrivez les étapes pour automatiser une sauvegarde quotidienne d'un répertoire spécifique vers un serveur distant à l'aide de SSH.
Réponse :
Tout d'abord, assurez-vous que l'authentification par clé SSH est configurée entre les serveurs source et destination pour éviter les invites de mot de passe. Ensuite, utilisez rsync -avz /source/dir/ user@remote:/destination/dir/ dans un script shell. Planifiez l'exécution quotidienne de ce script à l'aide d'une tâche cron, en garantissant une journalisation et une gestion des erreurs appropriées.
Administrateur : Quel est le but du fichier /etc/fstab, et quels sont les problèmes courants que vous pourriez y rencontrer ?
Réponse :
/etc/fstab définit les systèmes de fichiers statiques à monter au démarrage. Les problèmes courants incluent des chemins de périphériques incorrects, des types de systèmes de fichiers erronés ou des options de montage invalides, ce qui peut entraîner des échecs de démarrage ou le non-montage de partitions. L'utilisation de nofail peut éviter les problèmes de démarrage pour les montages non critiques.
DevOps : Comment assurez-vous l'idempotence dans vos scripts shell pour le provisionnement d'infrastructure ?
Réponse :
L'idempotence signifie que l'exécution répétée d'un script produit le même résultat que son exécution unique. J'y parviens en vérifiant l'existence des ressources avant de les créer (par exemple, if [ ! -f /path/to/file ]; then ... fi). Pour les installations de paquets, j'utilise des gestionnaires de paquets qui gèrent l'idempotence (par exemple, apt install -y package n'installe que si le paquet n'est pas présent). Les outils de gestion de configuration comme Ansible ou Puppet fournissent intrinsèquement l'idempotence.
DevOps : Expliquez comment vous utiliseriez un script shell dans un pipeline CI/CD pour déployer une application.
Réponse :
Dans un pipeline CI/CD, un script shell gérerait typiquement des tâches telles que la récupération des artefacts, l'arrêt des services existants, le déploiement du nouveau code (par exemple, copie de fichiers, extraction d'archives), l'exécution des migrations de base de données et le démarrage des services. Il inclurait la gestion des erreurs et la journalisation, interagissant souvent avec les commandes systemctl ou docker. Les variables d'environnement seraient utilisées pour la configuration.
DevOps : Quelles sont quelques bonnes pratiques pour écrire des scripts shell robustes et maintenables dans un environnement d'équipe ?
Réponse :
Les bonnes pratiques incluent l'utilisation de set -euo pipefail pour la gestion des erreurs, l'ajout de commentaires, l'utilisation de fonctions pour modulariser le code, des conventions de nommage cohérentes, la validation des entrées et la fourniture d'instructions d'utilisation claires. Le contrôle de version, les outils de linting (comme ShellCheck) et des tests approfondis sont également cruciaux pour la collaboration d'équipe et la maintenabilité.
DevOps : Comment géreriez-vous les secrets (par exemple, clés API, mots de passe) dans les scripts shell dans un contexte CI/CD ?
Réponse :
Les secrets ne devraient jamais être codés en dur. Dans CI/CD, j'utiliserais des variables d'environnement fournies par la plateforme CI/CD (par exemple, identifiants Jenkins, variables GitLab CI/CD). Pour des scénarios plus sensibles ou complexes, j'intégrerais un système de gestion des secrets comme HashiCorp Vault ou AWS Secrets Manager, en récupérant les secrets à l'exécution plutôt qu'en les stockant dans des scripts ou des dépôts.
Scripting pratique et tâches manuelles
Écrivez un script shell qui prend le chemin d'un répertoire en argument et compte le nombre de fichiers réguliers et de sous-répertoires qu'il contient. Gérez les cas où le répertoire n'existe pas.
Réponse :
#!/bin/bash
DIR="$1"
if [ ! -d "$DIR" ]; then
echo "Error: Directory '$DIR' not found."
exit 1
fi
files=$(find "$DIR" -maxdepth 1 -type f | wc -l)
dirs=$(find "$DIR" -maxdepth 1 -type d | wc -l)
## Subtract 1 from dirs for the directory itself
echo "Files: $files, Directories: $((dirs - 1))"
Comment trouver tous les fichiers de plus de 10 Mo dans le répertoire actuel et ses sous-répertoires, puis les lister triés par taille ?
Réponse :
Utilisez find . -type f -size +10M -print0 | xargs -0 du -h | sort -rh. find localise les fichiers, -print0 et xargs -0 gèrent les caractères spéciaux, du -h obtient les tailles lisibles par l'homme, et sort -rh trie par taille en ordre inverse lisible par l'homme.
Écrivez une ligne de commande pour remplacer toutes les occurrences de 'foo' par 'bar' dans tous les fichiers .txt du répertoire actuel.
Réponse :
find . -maxdepth 1 -type f -name "*.txt" -exec sed -i 's/foo/bar/g' {} \;
Ceci utilise find pour localiser les fichiers .txt et sed -i pour le remplacement sur place. Alternativement, grep -lR foo *.txt | xargs sed -i 's/foo/bar/g'.
Expliquez la différence entre $$ et $! dans le scripting shell.
Réponse :
$$ s'étend à l'identifiant du processus (PID) du shell actuel. $! s'étend au PID de la commande en arrière-plan (asynchrone) exécutée le plus récemment. Ils sont utiles pour créer des fichiers temporaires uniques ou gérer des processus en arrière-plan.
Comment analyser les arguments de la ligne de commande dans un script shell, en particulier les arguments nommés comme --file <path> ou -v ?
Réponse :
Utilisez getopts pour les options courtes (-v) ou une boucle while getopts. Pour les options longues (--file), une boucle while true; do case "$1" in ... esac; shift; done avec des instructions case est courante, souvent combinée avec shift pour consommer les arguments.
Écrivez un script qui surveille un fichier journal (par exemple, /var/log/syslog) et affiche les nouvelles lignes au fur et à mesure qu'elles sont ajoutées, similaire à tail -f.
Réponse :
#!/bin/bash
tail -f /var/log/syslog
Ceci utilise directement la commande tail -f, qui est conçue à cet effet. Pour une approche plus manuelle, on pourrait utiliser inotifywait ou une boucle avec wc -l et sed.
Comment faire en sorte qu'un script shell s'arrête immédiatement si une commande échoue ?
Réponse :
Ajoutez set -e au début du script. Cette option fait en sorte que le shell s'arrête immédiatement si une commande se termine avec un statut différent de zéro. C'est crucial pour une exécution de script robuste.
Vous avez un fichier CSV data.csv avec les colonnes Name,Age,City. Comment extrairiez-vous uniquement les colonnes Name et City en utilisant les outils shell standard ?
Réponse :
cut -d',' -f1,3 data.csv
Ceci utilise cut avec un délimiteur virgule (-d',') pour sélectionner le premier et le troisième champ (-f1,3). Alternativement, awk -F',' '{print $1 "," $3}' data.csv peut accomplir la même chose.
Écrivez une fonction dans un script shell qui prend deux nombres en arguments et retourne leur somme.
Réponse :
#!/bin/bash
sum_numbers() {
echo $(($1 + $2))
}
result=$(sum_numbers 10 5)
echo "Sum: $result"
Les fonctions sont définies avec nom_fonction() { ... }. L'expansion arithmétique $((...)) est utilisée pour les calculs. Le résultat est généralement affiché et capturé par substitution de commande.
Comment planifier l'exécution d'un script tous les jours à 3 heures du matin ?
Réponse :
Utilisez cron. Ajoutez une entrée au fichier crontab (crontab -e) comme 0 3 * * * /path/to/your_script.sh. Les champs représentent respectivement la minute, l'heure, le jour du mois, le mois et le jour de la semaine.
Dépannage et débogage de scripts shell
Bonnes pratiques et optimisation des performances des scripts shell
Comment optimiser un script shell pour les performances lors du traitement de fichiers volumineux ou de nombreuses itérations ?
Réponse :
Évitez les forks inutiles (par exemple, en utilisant grep dans une boucle). Utilisez les fonctionnalités intégrées du shell lorsque cela est possible (par exemple, l'expansion de paramètres au lieu de sed). Traitez les données par blocs ou utilisez awk pour un traitement efficace ligne par ligne.
Expliquez la différence entre $(command) et `command` pour la substitution de commande et laquelle est préférée pour les bonnes pratiques.
Réponse :
$(command) est la syntaxe moderne et préférée. Elle gère mieux les imbrications et évite les problèmes avec les barres obliques inverses et les guillemets qui peuvent survenir avec les backticks (`command`). $(command) est généralement plus lisible et plus robuste.
Quel est le but de set -e et set -u dans un script shell, et pourquoi sont-ils considérés comme de bonnes pratiques ?
Réponse :
set -e (errexit) fait en sorte que le script s'arrête immédiatement si une commande se termine avec un statut différent de zéro. set -u (nounset) traite les variables non définies comme une erreur et provoque la sortie. Les deux améliorent la robustesse du script en détectant les erreurs tôt et en empêchant les comportements inattendus.
Comment empêcher le 'globbing' ou l'expansion de noms de chemin dans un script shell ?
Réponse :
Pour empêcher le globbing, entourez la chaîne de guillemets doubles. Par exemple, ls "*.txt" traitera *.txt comme une chaîne littérale, tandis que ls *.txt sera développé en tous les fichiers .txt du répertoire actuel.
Quand devriez-vous utiliser [[ ... ]] au lieu de [ ... ] pour les expressions conditionnelles dans Bash ?
Réponse :
[[ ... ]] est un mot-clé spécifique à Bash qui offre plus de fonctionnalités que la commande [ ... ] conforme à POSIX. Il prend en charge la correspondance de motifs (=~), les opérateurs logiques (&&, ||), et évite la division de mots et l'expansion de noms de chemin, ce qui le rend plus sûr et plus puissant.
Décrivez un scénario où l'utilisation de xargs serait plus efficace qu'une boucle for.
Réponse :
xargs est plus efficace lors du traitement d'une grande liste d'éléments comme arguments d'une commande. Il construit des lignes de commande avec plusieurs arguments, réduisant ainsi le nombre de fois où la commande cible est invoquée, contrairement à une boucle for qui appelle généralement la commande une fois par élément.
Quelle est la signification de la redirection de stderr vers /dev/null (par exemple, 2>/dev/null) ?
Réponse :
La redirection de stderr vers /dev/null supprime les messages d'erreur, les empêchant d'être affichés sur la console ou de polluer la sortie. Ceci est utile pour supprimer les erreurs attendues ou lorsque vous ne vous souciez que de stdout.
Comment rendre un script shell plus portable sur différents systèmes de type Unix ?
Réponse :
Utilisez des commandes et des fonctionnalités conformes à POSIX autant que possible. Évitez les extensions spécifiques à Bash comme [[ ... ]] ou la substitution de processus si une portabilité stricte est requise. Spécifiez explicitement l'interpréteur à l'aide d'un shebang comme #!/bin/sh.
Pourquoi est-il généralement une mauvaise pratique d'analyser la sortie de ls dans les scripts shell ?
Réponse :
L'analyse de la sortie de ls est problématique car les noms de fichiers peuvent contenir des espaces, des sauts de ligne ou des caractères spéciaux, ce qui peut casser la logique du script lorsqu'il est traité par des outils comme awk ou des boucles for. Utilisez find -print0 | xargs -0 pour une gestion sûre des noms de fichiers.
Quel est le but de trap dans le scripting shell, et fournissez un exemple simple.
Réponse :
trap vous permet d'exécuter des commandes lorsque le shell reçoit un signal (par exemple, EXIT, INT, TERM). C'est crucial pour les opérations de nettoyage. Exemple : trap 'rm -f /tmp/mytempfile' EXIT garantit qu'un fichier temporaire est supprimé lorsque le script se termine.
Contrôle de version et collaboration avec Shell
Comment utilisez-vous généralement Git depuis la ligne de commande pour les tâches de développement quotidiennes ?
Réponse :
J'utilise principalement git status, git add, git commit -m "message", git pull, et git push. Pour la gestion des branches, j'utilise git checkout -b nom-de-branche et git merge ou git rebase.
Expliquez la différence entre git pull et git fetch.
Réponse :
git fetch télécharge de nouvelles données depuis un dépôt distant mais ne les intègre pas dans vos fichiers de travail. git pull est essentiellement git fetch suivi de git merge (ou git rebase, selon la configuration), intégrant les modifications dans votre branche actuelle.
Comment annuler un commit spécifique qui a déjà été poussé vers un dépôt distant ?
Réponse :
J'utiliserais git revert <hash_du_commit>. Cela crée un nouveau commit qui annule les modifications du commit spécifié, préservant ainsi l'historique du projet. C'est plus sûr que git reset --hard pour les branches partagées.
Décrivez un scénario où vous utiliseriez git rebase au lieu de git merge.
Réponse :
J'utiliserais git rebase pour maintenir un historique de projet propre et linéaire, en particulier sur les branches de fonctionnalités avant de les fusionner dans main. Il réapplique les commits d'une branche sur une autre, évitant les commits de fusion et rendant l'historique plus facile à lire.
Comment résoudre les conflits de fusion en utilisant la ligne de commande ?
Réponse :
Après un conflit de fusion, git status affiche les fichiers en conflit. Je modifie manuellement ces fichiers pour résoudre les conflits, puis j'utilise git add <fichier_en_conflit> pour les marquer comme résolus. Enfin, je termine la fusion avec git commit.
Qu'est-ce que git stash et quand l'utiliseriez-vous ?
Réponse :
git stash sauvegarde temporairement les modifications qui ne sont pas prêtes à être commitées, vous permettant de changer de branche ou d'effectuer d'autres tâches. C'est utile lorsque vous avez besoin de changer rapidement de contexte sans commiter un travail incomplet.
Comment afficher l'historique des commits d'un fichier spécifique ?
Réponse :
J'utilise git log -- <chemin_du_fichier>. Cette commande affiche tous les commits qui ont affecté le fichier spécifié, y compris le hash du commit, l'auteur, la date et le message du commit.
Vous avez accidentellement commité des informations sensibles. Comment les supprimer de votre historique Git ?
Réponse :
Pour les commits récents non poussés, git reset HEAD~1 suivi de la modification du commit est une option. Pour les commits poussés ou un historique plus profond, git filter-branch ou BFG Repo-Cleaner sont utilisés pour réécrire l'historique, mais cela est perturbateur et nécessite un force-push.
Expliquez le but d'un fichier .gitignore.
Réponse :
Un fichier .gitignore spécifie les fichiers intentionnellement non suivis que Git doit ignorer. Cela empêche les fichiers temporaires, les artefacts de build ou les fichiers de configuration sensibles d'être accidentellement commités dans le dépôt.
Comment créer et basculer vers une nouvelle branche dans Git ?
Réponse :
Pour créer et basculer vers une nouvelle branche, j'utilise git checkout -b nom-de-nouvelle-branche. Cette commande est un raccourci pour git branch nom-de-nouvelle-branche suivi de git checkout nom-de-nouvelle-branche.
Considérations de sécurité dans les scripts shell
Pourquoi est-il dangereux d'exécuter des scripts shell téléchargés à partir de sources non fiables ?
Réponse :
Les scripts non fiables peuvent contenir du code malveillant qui pourrait supprimer des fichiers, installer des logiciels malveillants, voler des données sensibles ou créer des portes dérobées. Ils s'exécutent avec les permissions de l'utilisateur qui les exécute, ce qui en fait un risque de sécurité important.
Comment prévenir les vulnérabilités d'injection de commandes dans les scripts shell ?
Réponse :
Citez toujours les variables contenant des entrées utilisateur, surtout lorsqu'elles sont utilisées dans des commandes. Utilisez set -e et set -u pour détecter les erreurs et les variables non définies. Évitez eval avec des entrées non fiables. Préférez les commandes spécifiques aux commandes générales et validez rigoureusement les entrées.
Expliquez l'importance de la validation des entrées dans les scripts shell pour la sécurité.
Réponse :
La validation des entrées garantit que les données fournies à un script sont conformes aux formats et valeurs attendus, empêchant ainsi le traitement d'entrées malveillantes. Cela atténue les risques tels que l'injection de commandes, le traversée de répertoires (path traversal) et les dépassements de tampon (buffer overflows) en rejetant les caractères invalides ou dangereux.
Quels sont les risques liés à l'utilisation de eval dans les scripts shell, et quand cela peut-il être acceptable ?
Réponse :
eval exécute ses arguments comme des commandes shell, ce qui le rend très susceptible à l'injection de commandes s'il est utilisé avec des entrées non fiables. Il est généralement acceptable uniquement lorsque l'entrée est entièrement contrôlée et approuvée par le script lui-même, ou lors de la construction dynamique de commandes simples et sûres.
Comment gérer en toute sécurité les informations sensibles comme les mots de passe ou les clés d'API dans les scripts shell ?
Réponse :
Évitez d'intégrer en dur les données sensibles directement dans les scripts. Utilisez plutôt des variables d'environnement (avec prudence), des fichiers de configuration sécurisés avec des permissions restreintes, ou des outils dédiés de gestion des secrets comme HashiCorp Vault ou AWS Secrets Manager. Ne les stockez jamais dans un système de contrôle de version.
Pourquoi est-il important de définir des permissions de fichiers appropriées pour les scripts shell et leurs fichiers de sortie ?
Réponse :
Des permissions de fichiers incorrectes peuvent permettre à des utilisateurs non autorisés de lire, modifier ou exécuter des scripts ou leurs sorties. Les scripts ne devraient généralement être exécutables que par leur propriétaire, et les fichiers de sortie sensibles devraient avoir des permissions de lecture/écriture restrictives pour éviter la fuite ou la falsification de données.
Quel est le but de set -u (ou set -o nounset) dans un script shell pour la sécurité ?
Réponse :
set -u fait en sorte que le script s'arrête immédiatement s'il tente d'utiliser une variable non définie. Cela empêche les comportements inattendus ou les vulnérabilités de sécurité qui pourraient découler d'une variable non initialisée interprétée comme une chaîne vide ou une valeur par défaut, conduisant potentiellement à une exécution de commande ou à des opérations sur des fichiers involontaires.
Décrivez le concept de 'moindre privilège' dans le contexte de l'exécution de scripts shell.
Réponse :
Le principe du moindre privilège stipule qu'un script doit s'exécuter avec les permissions minimales nécessaires pour accomplir sa fonction prévue. Cela limite les dommages potentiels si le script est compromis, car il n'aura pas d'accès élevé aux systèmes ou aux données dont il n'a pas besoin.
Comment la manipulation du PATH peut-elle entraîner des vulnérabilités de sécurité dans les scripts shell ?
Réponse :
Si la variable d'environnement PATH n'est pas soigneusement contrôlée, un utilisateur malveillant pourrait injecter son propre répertoire contenant un exécutable portant un nom similaire (par exemple, ls ou rm). Lorsque le script appelle cette commande, il pourrait exécuter la version malveillante au lieu de celle légitime, entraînant des actions involontaires.
Quelles sont quelques bonnes pratiques pour écrire des scripts shell sécurisés ?
Réponse :
Validez toutes les entrées utilisateur, citez les variables, utilisez set -euo pipefail, évitez eval avec des données non fiables, définissez des permissions de fichiers restrictives, utilisez des chemins absolus pour les commandes et suivez le principe du moindre privilège. Auditez régulièrement les scripts pour détecter les vulnérabilités et maintenez-les à jour.
Résumé
Une préparation approfondie est primordiale pour réussir le processus d'entretien rigoureux de Shell. En révisant diligemment les questions courantes, en comprenant les valeurs de Shell et en pratiquant vos réponses, vous augmentez considérablement vos chances de mettre en valeur vos capacités et votre adéquation au poste. Ce document sert de ressource précieuse pour guider votre préparation, vous aidant à anticiper les demandes potentielles et à formuler des réponses convaincantes.
N'oubliez pas que le parcours ne s'arrête pas à l'entretien. L'industrie de l'énergie est dynamique et l'apprentissage continu est la clé de la croissance professionnelle. Saisissez chaque opportunité d'élargir vos connaissances et vos compétences, en vous assurant de rester un atout précieux dans un paysage en constante évolution. Votre dévouement à la préparation et à l'apprentissage tout au long de la vie ouvrira sans aucun doute la voie à une carrière épanouissante.



