accueil > Environnement & utilitaires > expect

expect : automatisation de scripts de programmes interactifs

`expect` est une extension puissante de Tcl utilisée pour automatiser l'interaction avec des programmes interactifs. Elle permet de scripter des commandes qui nécessitent une entrée utilisateur pour être exécutées automatiquement. Elle est principalement utilisée pour contrôler des commandes telles que `ssh`, `ftp`, `passwd` dans des scripts.

Aperçu

`expect` automatise les sessions interactives en attendant des motifs prédéfinis (par exemple, des chaînes de caractères d'invite) puis en envoyant des chaînes de caractères spécifiques (par exemple, une entrée utilisateur). Cela permet d'effectuer des tâches complexes sans intervention manuelle.

Caractéristiques principales

  • Extension de langage de script basée sur Tcl
  • Automatisation de l'interaction avec des programmes interactifs (par exemple, ssh, ftp, telnet)
  • Fonctionnalité de correspondance de motifs d'invite et d'envoi de réponses
  • Utile pour automatiser des tâches répétitives et manuelles

Options principales

Ce sont les options qui contrôlent la façon dont la commande `expect` elle-même est exécutée. Elles sont différentes des commandes `expect` et `send` utilisées à l'intérieur d'un script.

Contrôle de l'exécution et débogage

Commande générée :

Essayez de combiner les commandes.

Description:

`expect` Exécute la commande.

Essayez d'exécuter virtuellement les commandes avec l'IA en combinant les options ci-dessus.

Installation

`expect` n'est généralement pas inclus par défaut dans la plupart des distributions Linux, il doit donc être installé via un gestionnaire de paquets.

Debian/Ubuntu

sudo apt update && sudo apt install expect

Installez `expect` en utilisant le gestionnaire de paquets APT.

RHEL/CentOS/Fedora

sudo dnf install expect

Installez `expect` en utilisant le gestionnaire de paquets DNF (ou Yum).

Exemples d'utilisation

Les scripts `expect` ont généralement une extension `.exp` et commencent par `#!/usr/bin/expect` pour être exécutés par l'interpréteur `expect`.

Réponse automatique à une invite simple

#!/usr/bin/expect
set timeout 10
spawn sh -c "echo -n 'Proceed? (y/n) '
read response"
expect "Proceed? (y/n) "
send "y\r"
expect eof

Un script qui répond automatiquement 'y' à une question telle que `Proceed? (y/n)`. (Utilisation de `sh` pour l'exemple)

Automatisation de la connexion SSH (Avertissement de sécurité)

#!/usr/bin/expect
set timeout 20
set username "your_user"
set hostname "your_host"
set password "your_password"

spawn ssh $username@$hostname
expect "password:"
send "$password\r"
expect "$"
send "ls -l\r"
expect "$"
send "exit\r"
expect eof

Exemple de connexion automatique à un serveur distant via SSH et d'exécution de commandes. **L'inclusion directe de mots de passe dans les scripts est très dangereuse pour la sécurité et n'est pas recommandée dans les environnements réels.**

Automatisation de la commande passwd (Avertissement de sécurité)

#!/usr/bin/expect
set timeout 10
set old_pass "old_password"
set new_pass "new_password"

spawn passwd
expect "Current password:"
send "$old_pass\r"
expect "New password:"
send "$new_pass\r"
expect "Retype new password:"
send "$new_pass\r"
expect eof

Exemple de modification automatique d'un mot de passe à l'aide de la commande `passwd`. **Le codage en dur des mots de passe dans les scripts est très dangereux pour la sécurité.**

Conseils et précautions

Les scripts `expect` sont puissants, mais il faut tenir compte de quelques précautions pour la sécurité et la stabilité.

Conseils principaux

  • **Sécurité des mots de passe** : L'encodage en dur des mots de passe directement dans les scripts est très dangereux. Envisagez d'utiliser des variables d'environnement, des fichiers de configuration sécurisés ou d'autres mécanismes de sécurité comme `ssh-agent`.
  • **Définir le délai d'attente** : Utilisez la commande `set timeout` pour définir le temps maximum pendant lequel `expect` attendra un motif spécifique. La valeur par défaut est de 10 secondes, et vous pouvez définir une attente infinie avec `set timeout -1`.
  • **Correspondance exacte des motifs** : `expect` prend en charge les expressions régulières. Les invites peuvent ne pas correspondre exactement, utilisez donc des motifs flexibles ou le caractère générique `*`.
  • **Débogage** : En exécutant avec `expect -d your_script.exp`, vous pouvez voir en détail quels motifs `expect` attend et quelles chaînes de caractères il envoie.
  • **Utilisation de `interact`** : Vous pouvez utiliser la commande `interact` lorsque vous souhaitez céder le contrôle à l'utilisateur à un moment donné pendant l'exécution du script.

Commandes de la même catégorie