La commande d'attente Linux vous permet d'automatiser les interactions avec les scripts et les programmes. Vous pouvez envoyer n'importe quel type de réponse au script lorsqu'il attend une entrée de texte.
L'automatisation est synonyme d'efficacité
Lorsque vous gérez un ordinateur Linux ou un groupe d'ordinateurs, vous rencontrerez de nombreuses tâches répétitives. La solution évidente est d'écrire un script pour faire la plupart du travail pour vous.. Le coup de coquille, comme tous les coquillages modernes, fournit un langage de script riche et flexible.
Le script d'un travail fastidieux ou fastidieux vous donne la possibilité d'exécuter cette tâche lorsque le bureau est fermé ou pendant les périodes plus calmes d'une opération. 24 heures de la journée, Les 7 jours de la semaine. Les scripts vous offrent également une répétabilité. Ils n'oublieront pas de faire un pas, peu importe combien de fois on leur demande de faire les mêmes tâches ennuyeuses.
Ça c'est bien, le plus loin possible. Mais si votre script a besoin d'une interaction avec l'utilisateur, ou si vous appelez un programme qui nécessitera une participation humaine, que vous pouvez faire? Vous ne voulez pas avoir à vous présenter lorsque le script s'exécute, ou si vous êtes présent, regardez la fenêtre du terminal prêt à sauter et appuyez sur certaines touches.
Linux a le yes
commander, qui envoie une séquence de caractères “et” ou toute autre chaîne spécifiée par l'utilisateur dans la fenêtre du terminal. Si un programme attend une réponse à une question oui ou non, l’un des personnages sera forcé “et”. Vous l'accepterez comme entrée et vous pourrez continuer. Vous devez rediriger la sortie de yes
dans le scénario.
Oui | script.sh
Vous ne voudrez peut-être pas envoyer une réponse affirmative. Peut-être avez-vous besoin de dire “non”. Tu peux aussi faire ça, en utilisant le yes
commander. Vous pouvez envoyer n'importe quelle phrase que vous voulez, vous n’êtes pas limité à des réponses telles que “et”, “ET”, “Oui”, “m”, “N” O “Non”.
Peut-être avez-vous besoin d’envoyer un “r” pour réinstaller un “install/upgrade/reinstall [i/u/r]
” maintenant.
oui r
Les yes
La commande ne peut pas faire face si vous devez fournir plus d'un type de réponse. Pour cette situation, nous devons utiliser expect
.
EN RELATION: Comment utiliser la commande yes sous Linux
Attendre l'installation de la commande
nous avons testé expect
sous Ubuntu, Fedora et Manjaro. Le package n'était pas inclus avec ces distributions, il a donc dû régler. Dans Ubuntu, écrivez:
sudo apt installer attendre
Dans Fedora, la commande dont vous avez besoin est:
sudo dnf installer attendre
À Manjaro, nous utilisons pacman
:
sudo pacman -Sy attendre
Comment attendre?
Les expect
La commande vous permet de gérer les deux bouts de la conversation entre votre ensemble de réponses préparées et le programme ou le script auquel vous les enverrez. Pour ca, crée un script “Attendu” qui recherche les directions dans le script principal et envoie la bonne solution pour chaque.
Supposons que vous ayez un script de sauvegarde qui demande un nom de répertoire source et un nom de répertoire de destination. Ensuite, effectue une copie des fichiers du répertoire source dans le répertoire de destination. Sans les bits qui copient le fichier, votre script peut ressembler à ceci:
#!/bin/bash echo "Répertoire à sauvegarder?" read source_directory echo "Emplacement de sauvegarde?" read target_directory echo echo "Répertoire cible:" $target_directory
tout ce que ce script fait est de demander les chemins d’accès aux deux répertoires. Imprimez le répertoire de destination dans la fenêtre du terminal afin que nous puissions voir que vous avez reçu une réponse de expect
et que je pouvais le lire correctement.
Pour fournir l’autre moitié de la conversation, nous créons un “script attendu”. Par convention, ceux-ci ont une extension “.Exp”. Cet exemple fonctionnera avec notre script “backup.sh”.
#!/usr/bin/expect -f set timeout -1 spawn ./backup.sh expect "Répertoire à sauvegarder?r" Envoyer -- "/accueil/dave/Documents/r" attendre "Emplacement de sauvegarde?r" Envoyer -- "/média/dave/externe/sauvegarde" attendre eof
Cela montre les trois commandes principales dans les scripts d'attente, les spawn
, expect
, et send
commandes.
Première chose à remarquer c'est le hangar ça se réfère à expect
, Non un bash
. Les -f
(déposer) le drapeau dit expect
les réponses proviennent d'un fichier.
effectivement, nous désactivons les timeouts en les réglant à l'infini avec -1.
Les spawn
la commande lance le script de sauvegarde.
Nous connaissons les deux questions que le script "backup.sh" va nous poser.. Pour chaque question, nous créons une ligne de “Attendez”. ceux-ci contiennent le message texte qui sera envoyé à la fenêtre du terminal via le script “backup.sh”. Ceci est ce que expect
le programme sera attentif. Lorsque expect
voir le message, le texte dans le send
La ligne est renvoyée au script “backup.sh”.
Les expect eof
les lignes disent expect
attendre la fin du fichier final à la fin du traitement dans le script automatisé.
Rendre les deux scripts exécutables:
chmod +x backup.sh
chmod +x backup.exp
Et utilisez le script “backup.exp” pour commencer toute la procédure.
./backup.exp
Vous pouvez voir les deux indications de “backup.sh” et les réponses de “backup.exp”.
Cela deviendra fastidieux
C'est cool de voir deux scripts interagir comme ça, avec les réponses automatiques envoyées par notre script d'attente et acceptées comme une véritable entrée par le script automatisé. Ceci est juste un exemple simple, résolument. Si vous essayez d'automatiser une longue procédure, et ce sont eux que vous souhaitez automatiser, sera bientôt bloqué.
Le texte dans le expect
les lignes doivent correspondre exactement aux invites du script que vous automatisez. Les fautes d'orthographe et les mots incorrects entraîneront le saut d'un message et la procédure automatisée s'arrêtera. Si vous développez ou modifiez toujours le script que vous essayez d'automatiser, le libellé des invites et leur ordre dans le script sont susceptibles de changer. Les mises à jour de script ou de programme peuvent changer, supprimer ou insérer des messages. Garder une trace des modifications et les répliquer dans votre script attendu devient fastidieux et sujet aux erreurs.
Le moyen le plus pratique de créer un script d'attente est d'utiliser autoexpect
. Celui-ci est installé avec expect
. Nous pouvons dire autoexpect
pour surveiller notre interaction dans la vie réelle avec un script ou un programme, et générer un fichier d'attente pour nous.
Certains travaux peuvent être nécessaires dans le fichier d'attente généré, mais c'est beaucoup plus rapide que d'en écrire un à la main. Par exemple, si vous avez mal orthographié quelque chose dans votre session alors que autoexpect le surveille, les frappes incorrectes seront capturées et leur édition et retour arrière pour les corriger. Pour arranger ça, supprimez simplement cette section et écrivez le texte correct.
Utilisation de l'attente automatique
À l'aide de autoexpect
c'est facile. Nous utilisons le -f
(nom de fichier) pour indiquer le nom du fichier attendu à créer et le programme ou script que l'on veut exécuter. Les instructions de procédure et nos réponses sont enregistrées et envoyées dans le fichier d'attente. Comme une belle touche, autoexpect
rend le fichier d'attente exécutable pour nous.
Disons que nous utilisons souvent rsync
envoyer des fichiers d'un ordinateur vers un répertoire sur un autre ordinateur via le réseau. nous utiliserons autoexpect
pour créer un fichier d'attente pour cette procédure.
Notre ligne de commande ressemble à ceci. La première commande est autoexpect
Suivi par le -f
flag et le nom du fichier d'attente que nous voulons créer. Dans cette circonstance, il est “envoyer-photos.exp”.
Le reste de la commande est le régulier rsync
commander. Dû au fait que rsync
Utilisez le SSH
protocole pour se connecter à distance à l'ordinateur cible, nous devrons fournir le mot de passe du compte utilisateur “dave” sur l’ordinateur cible.
autoexpect -f send-pics.exp rsync -rasv ~/Pictures/raw/ [email protected]:/accueil/dave/brut/
Lorsque nous exécutons cette commande rsync
il démarre et on nous demande le mot de passe du compte d'utilisateur dave sur l'ordinateur distant. Une fois que vous entrez, certains fichiers sont envoyés à l'ordinateur distant, rsync
rompt la connexion et la procédure se termine.
On nous dit que le fichier a été créé “envoyer-photos.exp”. Nous allons voir:
ls -l send-pics.exp
En réalité, a été créé et est exécutable. Nous pouvons l'exécuter en l'appelant par son nom:
./envoyer-photos.exp
Cette fois, la procédure se déroule sans aucune interaction humaine. Tous les nouveaux fichiers depuis le dernier transfert sont envoyés à la machine distante.
Ceci est un très petit exemple de script. Cela économise à peine des efforts par rapport à l'exécution du rsync
commande manuelle. Bien que ce soit vrai, illustre le fait qu'il peut contrôler à la fois les programmes et les scripts, et vous pouvez appliquer les principes vus ici à des scripts ou des processus de n'importe quelle longueur.
EN RELATION: Comment sauvegarder votre système Linux
Attendre, mon mot de passe!
Vous devez faire attention que tout mot de passe, ou toute autre information confidentielle, collecté lors d'une autoexpect
La session est stockée en texte brut dans le script d'attente généré. Les mots de passe ne doivent jamais être écrits en texte brut où que ce soit. Pour les connexions SSH, une meilleure solution consiste à utiliser des clés SSH et avoir un schéma d'authentification sans mot de passe.
Évidemment, cela n'aidera pas si vous n'utilisez pas SSH.
Vous pouvez éditer votre script d'attente et changer la ligne traitant de votre mot de passe en:
interagir ++ revenir
Lorsque le script atteint cette ligne, attendra votre entrée, qui vous permettra de saisir votre mot de passe. Le contrôle revient ensuite au script attendu une fois que vous avez fourni votre mot de passe.
./envoyer-photos.exp
Mais cela présente un obstacle différent. Cela signifie que votre script ne peut plus être ouvert sans surveillance. Si vous allez toujours démarrer manuellement votre script, ça n'a probablement pas d'importance, surtout si la demande de mot de passe arrive juste au début du script. Vous pouvez démarrer le script, entrez votre mot de passe puis laissez-le s'occuper de lui-même.
Une autre façon d'aborder le problème est:
- Modifier les autorisations de fichier dans votre script attendu en utilisant
chown
Al 740,-rwxr-x---
. - Utilisation
chmod
pour changer le propriétaire du groupe du script d'attente à un groupe de confiance. - Créez un script régulier qui démarre votre script attendu. Configurez ce fichier pour qu'il appartienne également au groupe de confiance. Définissez les autorisations à ce sujet dans 2751,
-rwxr-s--x
. - Cela crée un script de démarrage que tout le monde peut lire et exécuter, qui est dans le même groupe de confiance que le script wait, et avec son
setgid
jeu de bits. Peu importe qui exécute ce script, votre groupe effectif sera le groupe de confiance et non le groupe de la personne exécutant le script. Pour cela, ce script pourra toujours exécuter le script d'attente. - Pendant, le script d'attente contenant le mot de passe n'est inaccessible qu'à vous.
EN RELATION: Comment utiliser SUID, SGID et Sticky Bits sous Linux
Vous pouvez vous attendre à de grandes choses
En voici assez pour vous lancer, mais il y a beaucoup plus à expect
que les domaines que nous avons couverts. Les expect
La page de manuel a plus de 1700 lignes!
Pour des tâches telles que les installations automatisées, sauvegardes planifiées ou déploiements répétitifs, l'attente transformera votre flux de travail.