Les scripts expect et les scripts shell (sh) sont tous deux utilisés pour l’automatisation sous Linux, mais leurs objectifs fondamentaux divergent radicalement : expect est conçu pour automatiser les tâches **interactives**, tandis que les scripts shell visent principalement l’**automatisation générique** des opérations système. Cette distinction se reflète dans leur syntaxe, leurs dépendanecs et leurs domaines d’application.
1. Caractéristiques essentielles
a. Scripts Expect
Basés sur le langage Tcl et nécessitant l’outil expect, ces scripts sont spécialisés dans la gestion de scénarios interactifs. Leurs trois traits distinctifs sont :
- Automatisation interactive : grâce aux commandes
spawn(lancer un processus),expect(attendre une sortie spécifique) etsend(envoyer une réponse), ils simulent des interactions humaines — par exemple, répondre automatiquement à une invite de mot de passe SSH ou confirmer une connexion FTP. - Dépendance externe : l’outil
expectdoit être installé manuellement (non présent par défaut). La première ligne du script est toujours#!/usr/bin/expect -f, où-findique la lecture depuis un fichier. - Syntaxe Tcl : les variables s’initialisent avec
set(set passwd "secret"), les boucles suivent la forme Tcl (for {set i 0} {$i < 3} {incr i}), ce qui diffère radicalement de la syntaxe shell.
b. Scripts Shell (sh)
Conçus selon la grammaire du Bourne Shell, ces scripts constituent la base de l’automatisation système sous Linux. Leurs points forts sont :
- Compatibilité universelle : exécutés via
/bin/sh(souvent un lien symbolique versbashoudash), ils fonctionnent sans installation supplémentaire sur toute distribution Linux. - Traitement de tâches non interactives : idéaux pour manipuler des fichiers (
cp,mv), gérer des services (systemctl,cron) ou itérer sur des ensembles de données. - Syntaxe intuitive : affectation directe (
passwd="secret"), structures conditionnelles (if [ -d /tmp ]; then ...) et boucles simples (for f in *.log; do ...), facilitant l’apprentissage pour les administrateurs.
2. Comparaison synthétique
| Dimension | Scripts Expect | Scripts Shell (sh) |
|---|---|---|
| Objectif principal | Automatiser les interactions dynamiques (ex. saisie de mot de passe) | Exécuter des tâches système non interactives |
| Dépendances | Nécessite expect ; shebang #!/usr/bin/expect -f |
Fonctionne avec /bin/sh ; shebang #!/bin/sh |
| Langage sous-jacent | Tcl | Bourne Shell |
| Commandes clés | spawn, expect, send, interact |
if, for, while, commandes système (grep, tar) |
| Gestion des interactions | Élevée : réagit à des invites dynamiques | Limitée : uniquement via redirections statiques (<<) |
| Portabilité | Faible : dépend de l’installation de expect |
Élevée : disponible partout sur Linux |
3. Cas d’usage typiques
a. Scénarios réservés à Expect
Utilisé lorsque l’interaction humaine est incontournable :
- Connexion SSH automatisée : connexion à distance avec saisie automatique du mot de passe et exécution de commandes.
#!/usr/bin/expect -f
set host "10.0.0.5"
set login "admin"
set secret "mypass"
spawn ssh $login@$host
expect "*password:*"
send "$secret\r"
expect "$ "
send "uptime\r"
interact
- Interaction avec des outils en mode texte : automatisation de sessions FTP, configuration interactive de logiciels.
- Tests fonctionnels : simulation de parcours utilisateur complets dans des applications CLI.
b. Domaines privilégiés du shell
Idéal pour les tâches systèmes classiques :
- Sauvegardes planifiées : exécution quotidienne via
cron.
#!/bin/sh
BACKUP_PATH="/backups"
DB_NAME="prod_db"
mysqldump -u backup_user -p"db_secret" $DB_NAME | gzip > $BACKUP_PATH/${DB_NAME}_$(date +%F).sql.gz
- Opérations en masse : renommage de fichiers, envoi groupé d’e-mails.
- Provisioning serveur : installation de paquets, configuration réseau, gestion de services.
4. Recommandations de choix
- Privilégier le shell pour toutes les tâches ne nécessitant pas d’interaction dynamique. Il offre simplicité, portabilité et faible coût d’entretien.
- Recourir à Expect uniquement en cas de besoin impératif d’interaction (ex. authentification interactive). Dans ce cas, encapsuler l’appel à
expectdepuis un script shell pour séparer la logique générale de la gestion interactive.