English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Metodo dettagliato per implementare l'interazione automatizzata di Shell utilizzando il comando expect

Sfondo

Nella scrittura di script Linux ci sono molte situazioni che riguardano operazioni remote, come login remoto ssh, copia remota scp, trasmissione di file sftp, ecc. Questi comandi coinvolgono sempre l'inserimento di password di sicurezza, e per utilizzare i comandi normalmente è necessario inserire manualmente le password e accettare la verifica di sicurezza. Per implementare operazioni remote automatizzate, possiamo utilizzare le funzionalità di expect.

Expect è un linguaggio di programmazione gratuito utilizzato per implementare la comunicazione tra compiti automatici e interattivi senza l'intervento dell'uomo. Expect è in continua evoluzione e, man mano che passa il tempo, diventa sempre più potente, diventando un potente assistente per gli amministratori di sistema. Expect richiede il supporto del linguaggio di programmazione Tcl per funzionare correttamente sul sistema, quindi è necessario installare Tcl prima di eseguire expect.

Installazione di expect

Expect è stato creato sulla base di Tcl, quindi prima di installare expect dovremmo prima installare Tcl.

(Primo) Installazione di Tcl

Pagina principale: http://www.tcl.tk

Indirizzo di download: http://www.tcl.tk/software/tcltk/downloadnow84.tml

1. Scarica il pacchetto sorgente

wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz 

2. Decomprimi il pacchetto sorgente

tar xfvz tcl8.4.11-src.tar.gz 

3. Installazione e configurazione

cd tcl8.4.11/unix 
./configure --prefix=/usr/tcl --enable-shared 
make 
make install 

Attenzione:

1. Dopo aver completato l'installazione, entra nella directory radice del codice sorgente di tcl, copia il file tclUnixPort.h dalla sottodirectory unix alla sottodirectory generic.

2. Non eliminare il codice sorgente di tcl temporaneamente, perché il processo di installazione di expect lo necessita.

(Due) Installazione di expect (richiede le librerie di Tcl)

Pagina principale: http://expect.nist.gov/

1. Scarica il pacchetto sorgente

wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download 

2. Decomprimi il pacchetto sorgente

tar xzvf expect5.45.tar.gz 

3. Installazione e configurazione

cd expect5.45 
./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic 
make 
make install 
ln -s /usr/tcl/bin/expect /usr/expect/bin/expect 

expect

Il cuore di expect è spawn, expect, send, set.

spawn chiama il comando da eseguire

  • expect aspetta la comparsa del messaggio di prompt del comando, ovvero cattura il prompt di input dell'utente:
  • send invia il valore di interazione necessario, sostituendo il contenuto di input manuale dell'utente
  • set imposta il valore della variabile
  • interact mantiene lo stato di interazione dopo l'esecuzione, passa il controllo al terminale, a questo punto è possibile operare manualmente. Senza questa istruzione, dopo il login verrai disconnesso invece di rimanere sul terminale remoto.
  • expect eof è assolutamente necessario aggiungere, corrisponde a spawn per catturare la fine dell'output delle informazioni terminali, simile a if...endif

Lo script expect deve finire con interact o expect eof, per eseguire task automatizzate di solito è sufficiente expect eof.

Altre impostazioni

  • Imposta timeout infinito set timeout -1
  • Imposta timeout di attesa di 300 secondi, se non viene visualizzato alcun contenuto di expect entro 300 secondi, esci set timeout 300

La sintassi di expect è scritta

Expect utilizza la sintassi Tcl

  • Un comando Tcl è composto da parole separate da spazi. La prima parola è il nome del comando, le altre sono i parametri del comando
    cmd arg arg arg
  • Il simbolo "$" rappresenta il valore di una variabile. Nel presente esempio, il nome della variabile è foo.
    $foo
  • Le parentesi quadre eseguono un comando annidato. Ad esempio, se vuoi passare il risultato di un comando come parametro di un altro comando, usa questo simbolo
    [cmd arg]
  • Le virgolette marcano un'intera frase come parametro di un comando. Il simbolo "$" e le parentesi quadre vengono ancora interpretati all'interno delle virgolette
    "some stuff"
  • Le parentesi graffe marcano un'intera frase come parametro di un comando. Tuttavia, altri simboli non vengono interpretati all'interno delle parentesi graffe
    {some stuff}
  • Il simbolo di backslash è usato per citare simboli speciali. Ad esempio: n rappresenta un ritorno a capo. Il simbolo di backslash viene anche usato per chiudere il significato speciale di "$", virgolette, parentesi quadre e parentesi graffe

Esempio

login.exp è specifico per il login remoto, modo d'uso rapido: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"

#!/usr/bin/expect -f
##########################################################
# Accesso SSH e esecuzione dei comandi
# Parametro:1.Use_Type [check/execute]
#  2.SSHServerIp
#  3.SSHUser
#  4.SSHPassword
#  5.CommandList [comandi multipli separati da punto e virgola]
# Valore di ritorno:
#  0 Successo
#  1 Numero di parametri non corretto
#  2 Servizio server SSH non aperto
#  3 Password utente SSH non corretta
#  4 Connessione SSH server timeout
##########################################################
proc usage {} {
 regsub ".*/" $::argv0 "" name
 send_user "Usage:\n"
 send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n"
 exit 1
} 
## Giudizio del numero di parametri
if { [llength $argv] != 5 } {
 usage
}
# Set variable values
set Use_Type [lindex $argv 0]
set SSHServerIp [lindex $argv 1]
set SSHUser [lindex $argv 2]
set SSHPassword [lindex $argv 3]
set CommandList [lindex $argv 4]
#spawn ping ${SSHServerIp} -w 5
#expect {
# -nocase -re "100% packet loss" {
#  send_error "Ping ${SSHServerIp} is unreachable, Please check the IP address.\n"
#  exit 1
# }
#}
set timeout 360
set resssh 0
# Define variable to mark whether yes confirmation is entered during SSH connection
set inputYes 0
set ok_string LOGIN_SUCCESS
if {$Use_Type=="check"} {
 # Activate SSH connection, if you need to enter yes to confirm, enter yes, set inputYes to 1, otherwise enter SSH password
 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string"
} else {   
 spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList"
}
expect {
 -nocase -re "yes/no" {
  send -- "yes\n"
  set inputYes 1
 }
 -nocase -re "assword: " {
  send -- "${SSHPassword}\n"
  set resssh 1
 }
 #-nocase -re "Last login: " { 
 #  send -- "${CommandList}\n"
 #}
 $ok_string {}
 -nocase -re "Connection refused" {
  send_error "SSH services at ${SSHServerIp} is not active.\n"
  exit 2
 }
 timeout {
  send_error "Connect to SSH server ${SSHUser}@${SSHServerIp} timeout(10s).\n"
  exit 4
 }
}
# Se è stato inserito yes per confermare, inserire la password ssh
if {$inputYes==1} {
 expect {
  -nocase -re "assword: " {
   send -- "${SSHPassword}\n"
   set resssh 1
  }
 }
}
# Se viene visualizzato il messaggio try again o password:, significa che il nome utente e la password inseriti sono errati, quindi esce direttamente.
if {$resssh==1} {
 expect {
  -nocase -re "try again" {
   send_error "SSH user:${SSHUser} passwd error.\n"
   exit 3
  }
  -nocase -re "assword:" {
   send_error "SSH user:${SSHUser} passwd error.\n"
   exit 3
  }
  eof {}
 }
}
send_error -- "$expect_out(buffer)"
#-nocase -re "No such user" {
#  send_error "No such user.\n"
#  exit 5
# }
#exit

Sommario

Questo è tutto il contenuto dell'articolo, speriamo che il contenuto di questo articolo abbia un valore di riferimento o di studio per voi. Se avete domande, potete lasciare un messaggio per scambiare opinioni, grazie per il supporto al manuale di urla.

Dichiarazione: il contenuto di questo articolo è stato tratto da Internet, di proprietà del rispettivo autore, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, il sito web non detiene i diritti di proprietà, non è stato editato manualmente e non assume responsabilità legali correlate. Se trovi contenuti sospetti di copyright, ti preghiamo di inviare una e-mail a notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, il sito web rimuoverà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare