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 un “install/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 comandos “esperada” que 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 un “guión esperado”. Per convenzione, estos disponen una extensión “.exp”. Este ejemplo funcionará con nuestro script “backup.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 de “espera”. Estos contienen el mensaje de texto que se enviará a la ventana del terminal a través de el script “backup.sh”. Questo è ciò expect
il programma sarà attento. quando expect
vedi il messaggio, il testo in send
La línea se devuelve al script “backup.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 de “backup.sh” y 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.
Puoi modificare il tuo script di attesa e cambiare la riga relativa alla tua password in:
interagire ++ Restituzione
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.