Automatisez les entrées dans les scripts Linux avec la commande wait

Contenu

Bash Shell

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.

Mot de passe stocké en texte brut dans le script d'attente, dans l'éditeur gedit

Vous pouvez éditer votre script d'attente et changer la ligne traitant de votre mot de passe en:

interagir ++ revenir

Commande interactive dans le script d'attente, dans l'éditeur gedit

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.

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.