Automatizza gli input agli script Linux con il comando wait

Contenuti

Bash Shell

Il comando wait di Linux ti consente di automatizzare le interazioni con script e programmi. Puoi inviare qualsiasi tipo di risposta allo script quando si aspetta un input di testo.

Automazione significa efficienza

Quando gestisci un computer Linux o un gruppo di computer, ti imbatterai in molti compiti ripetitivi. La soluzione ovvia è scrivere uno script per fare la maggior parte del lavoro per te.. La shell bash, come tutte le conchiglie moderne, fornisce un linguaggio di scripting ricco e flessibile.

Lo scripting di un lavoro noioso o noioso ti dà la flessibilità di eseguire quell'attività quando l'ufficio è chiuso o durante i periodi più silenziosi di un'operazione. 24 ore del giorno, il 7 giorni della settimana. Gli script ti danno anche ripetibilità. Non dimenticheranno di fare un passo, non importa quante volte gli venga chiesto di fare gli stessi noiosi compiti.

Va bene, per quanto possibile. Ma se il tuo script richiede l'interazione dell'utente, o se chiami un programma che richiederà la partecipazione umana, Cosa sai fare? Non devi presentarti quando viene eseguito lo script, o se sei presente, guarda la finestra del terminale pronto per saltare e premere alcuni tasti.

Linux ha il yes comando, que envía una secuencia de caracteres “e” o qualsiasi altra stringa specificata dall'utente nella finestra del terminale. Se un programma sta aspettando una risposta a una domanda sì o no, se forzará uno de los caracteres “e”. Lo accetterai come input e potrai continuare. Devi reindirizzare l'output da yes nella sceneggiatura.

sì | script.sh

Potresti non voler inviare una risposta affermativa. Tal vez necesite decir “no”. Puoi farlo anche tu, usando il yes comando. Puoi inviare qualsiasi frase tu voglia, no está restringido a respuestas como “e”, “E”, “sì”, “n”, “n” oh “No”.

Tal vez necesite enviar una “R” para reinstalar a uninstall/upgrade/reinstall [i/u/r] ” proprio ora.

si r

il yes Il comando non può farcela se è necessario fornire più di un tipo di risposta. Per quella situazione, dobbiamo usare expect .

IMPARENTATO: Come usare il comando yes in Linux

Attendi l'installazione del comando

abbiamo testato expect in Ubuntu, Fedora e Manjaro. Il pacchetto non era incluso in queste distribuzioni, quindi ha dovuto accontentarsi. In Ubuntu scrivi:

sudo apt install aspetta

In Fedora, il comando che ti serve è:

sudo dnf install aspetta

A Manjaro usiamo pacman:

sudo pacman -Sy aspetta

come aspetta??

il expect Il comando ti permette di gestire le due estremità della conversazione tra il tuo set di risposte preparate e il programma o script a cui le invierai. Per questo, crea una secuencia de comandosesperadaque busca indicaciones en la secuencia de comandos principal y envía la solución adecuada para cada una.

Supongamos que tiene un script de respaldo que solicita un nombre de directorio de origen y un nombre de directorio de destino. Prossimo, realiza una copia de los archivos del directorio de origen en el directorio de destino. Sin los bits que copian el archivo, su secuencia de comandos podría verse así:

#!/bin/bash

echo "Directory to backup?"
read source_directory

echo "Backup location?"
read target_directory

echo
echo "Target directory:" $target_directory

Todo lo que hace este script es pedir las rutas a los dos directorios. Imprime el directorio de destino en la ventana del terminal para que podamos ver que recibió una respuesta de expect y que pudiera leerlo correctamente.

Para proporcionar la otra mitad de la conversación, creamos unguión esperado”. Per convenzione, estos disponen una extensión “.exp”. Este ejemplo funcionará con nuestro scriptbackup.sh”.

#!/usr/bin/expect -f

set timeout -1

spawn ./backup.sh

expect "Directory to backup?R"
send -- "/home/dave/Documenti/r"

aspettarsi "Backup location?R"
send -- "/media/dave/esterno/backup"

aspettati eof

Questo mostra i tre comandi principali negli script di attesa, il spawn, expect, e send comandi.

La prima cosa da notare è il capanno si riferisce a expect, No a bash. il -f (file) la bandiera dice expect le risposte provengono da un file.

effettivamente, disabilitiamo i timeout impostandoli all'infinito con -1.

il spawn il comando avvia lo script di backup.

Conosciamo le due domande che ci porrà lo script "backup.sh".. Para cada pregunta creamos una línea deespera”. Estos contienen el mensaje de texto que se enviará a la ventana del terminal a través de el scriptbackup.sh”. Questo è ciò expect il programma sarà attento. quando expect vedi il messaggio, il testo in send La línea se devuelve al scriptbackup.sh”.

il expect eof le linee dicono expect attendere la fine del file finale al termine dell'elaborazione nello script automatizzato.

Rendi eseguibili entrambi gli script:

chmod +x backup.sh
chmod +x backup.exp

Y use el script “backup.exp” para iniciar todo el procedimiento.

./backup.exp

Puede ver las dos indicaciones debackup.shy las respuestas de “backup.exp”.

Diventerà complicato in fretta

È bello vedere due script interagire in questo modo, con le risposte automatiche inviate dal nostro script di attesa e accettate come input autentico dallo script automatico. Questo è solo un semplice esempio, decisamente. Se stai cercando di automatizzare una procedura lunga, e sono quelli che vuoi automatizzare, sarà presto bloccato.

Il testo in expect le righe devono corrispondere esattamente ai prompt dello script che stai automatizzando. Errori di ortografia e diciture errate faranno saltare un messaggio e la procedura automatizzata si interromperà. Se stai ancora sviluppando o modificando lo script, stai cercando di automatizzare, è probabile che la formulazione dei prompt e il loro ordine all'interno dello script cambino. Gli aggiornamenti dello script o del programma possono cambiare, rimuovere o inserire messaggi. Tenere traccia delle modifiche e replicarle nello script previsto diventa noioso e soggetto a errori.

Il modo più conveniente per creare uno script di attesa è usare autoexpect. Questo è installato insieme a expect. Possiamo dire autoexpect per monitorare la nostra interazione nella vita reale con uno script o un programma, e genera un file di attesa per noi.

Potrebbe essere necessario eseguire del lavoro nel file di attesa generato, ma è molto più veloce che scriverne uno a mano. Come esempio, se sbagli a scrivere qualcosa nella tua sessione quando autoexpect lo sta monitorando, le sequenze di tasti errate verranno catturate e la loro modifica e il backspace per correggerle. Per aggiustarlo, basta eliminare quella sezione e scrivere il testo corretto.

Utilizzo di autoexpect

Usando autoexpect È facile. Noi usiamo il -f (nome del file) per indicare il nome del file atteso da creare e il programma o script che vogliamo eseguire. Le istruzioni procedurali e le nostre risposte vengono registrate e inviate al file di attesa. Come un bel tocco, autoexpect rende eseguibile il file di attesa per noi.

Diciamo che usiamo spesso rsync inviare file da un computer a una directory su un altro computer tramite rete. noi useremo autoexpect per creare un file di attesa per quella procedura.

La nostra riga di comando ha questo aspetto. Il primo comando è autoexpect Seguito da -f flag e il nome del file di attesa che vogliamo creare. In questa circostanza, è “send-pics.exp”.

Il resto del comando è normale rsync comando. Perché rsync utilizzare il SSH protocollo per connettersi in remoto al computer di destinazione, necesitaremos proporcionar la contraseña para la cuenta de usuario “dave” en la computadora de destino.

autoexpect -f send-pics.exp rsync -rasv ~/Pictures/raw/ [email protected]:/home/dave/grezzo/

Quando eseguiamo quel comando rsync si avvia e ci viene richiesta la password per l'account utente dave sul computer remoto. Una volta entrato, alcuni file vengono inviati al computer remoto, rsync interrompe la connessione e la procedura termina.

Se nos dice que se ha creado el archivo “send-pics.exp”. Vedremo:

ls -l send-pics.exp

In realtà, è stato creato ed è eseguibile. Possiamo eseguirlo chiamandolo per nome:

./send-pics.exp

Questa volta, la procedura viene eseguita senza alcuna interazione umana. Tutti i nuovi file dall'ultimo trasferimento vengono inviati alla macchina remota.

Questo è uno script di esempio molto piccolo. Difficilmente si risparmia fatica rispetto all'esecuzione del rsync comando manuale. Anche se è vero, illustra il punto in cui può controllare sia i programmi che gli script, e puoi applicare i principi visti qui a script o processi di qualsiasi lunghezza.

IMPARENTATO: Come eseguire il backup del tuo sistema Linux

In attesa, la mia password!

Dovresti prestare attenzione che qualsiasi password, o qualsiasi altra informazione riservata, raccolti durante a autoexpect La sessione è memorizzata in testo normale nello script di attesa generato. Le password non dovrebbero mai essere scritte in chiaro da nessuna parte. Per connessioni SSH, una soluzione migliore è usare le chiavi SSH e avere uno schema di autenticazione senza password.

Evidentemente, questo non ti aiuterà se non stai usando SSH.

Password memorizzata in testo normale nello script di attesa, nell'editor gedit

Puoi modificare il tuo script di attesa e cambiare la riga relativa alla tua password in:

interagire ++ Restituzione

Comando interattivo nello script di attesa, nell'editor gedit

Quando lo script raggiunge questa riga, aspetterò il tuo contributo, che ti permetterà di inserire la tua password. Il controllo ritorna successivamente allo script previsto una volta che hai fornito la tua password.

./send-pics.exp

Ma questo presenta un ostacolo diverso. Significa che il tuo script non può più essere aperto senza supervisione. Se hai sempre intenzione di avviare manualmente il tuo script, probabilmente non importa, soprattutto se la richiesta della password avviene proprio all'inizio dello script. Puoi iniziare lo script, inserisci la tua password e poi lascia che si occupi di se stessa.

Un altro modo per affrontare il problema è:

  • Modificare i permessi dei file nello script previsto usando chown al 740, -rwxr-x---.
  • Utilizzo chmod per cambiare il proprietario del gruppo dallo script di attesa a un gruppo attendibile.
  • Crea uno script regolare che avvii lo script previsto. Configura questo file in modo che sia anche di proprietà del gruppo di fiducia. Imposta i permessi su questo in 2751, -rwxr-s--x.
  • Questo crea uno script di avvio che chiunque può leggere ed eseguire, che si trova nello stesso gruppo di fiducia dello script di attesa, e con il suo setgid bit impostato. Indipendentemente da chi esegue questo script, il tuo gruppo effettivo sarà il gruppo fidato e non il gruppo della persona che esegue lo script. Perché, questo script sarà sempre in grado di eseguire lo script di attesa.
  • Intanto, lo script di attesa contenente la password è inaccessibile a chiunque tranne te.

IMPARENTATO: Come usare SUID, SGID e Sticky Bits su Linux

Puoi aspettarti grandi cose

Ecco abbastanza per farti andare, ma c'è molto altro da fare expect che le aree che abbiamo coperto. il expect La pagina man ha più di 1700 Linee!

Per attività come installazioni automatizzate, backup pianificati o implementazioni ripetitive, l'attesa trasformerà il tuo flusso di lavoro.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.