2013-07-15 21 views
5

Quello che sto cercando di fare è di:leggere il file in stringa e fare un ciclo in Aspettatevi Script

  1. Creare un file .exp, che leggerà dal file *.txt dalla stessa directory e analizzare tutti i contenuti nel file di testo in una variabile stringa nello script expect.
  2. Loop della stringa, che contiene una serie di nomi host, ed eseguire una serie di comandi finché la stringa non viene enumerata.

Così che lo script non, viene letta una serie di host da un file txt nella stessa directory, e quindi leggere in una stringa, e il file di .exp sarà automatica del registro in ciascuno di essi e eseguirli una serie di comandi.

Ho il seguente codice scritto, ma non sta funzionando:

#!/usr/bin/expect 

set timeout 20 
set user test 
set password test 

set fp [open ./*.txt r] 
set scp [read -nonewline $fp] 
close $fp 

spawn ssh [email protected]$host 

expect "password" 
send "$password\r" 

expect "host1" 
send "$scp\r" 

expect "host1" 
send "exit\r" 

Qualsiasi aiuto è molto apprezzato ....

+0

Sono un po 'confuso. Avete un file che elenca tutti i comandi e un altro elenco di tutti gli host? O hai una directory con un file per host (chiamato da hostname con estensione .txt?) Che contiene i comandi da eseguire su quell'host? –

+0

ciao. Sto cercando di creare un ciclo. per prima cosa leggi il file host.txt, che contiene tutti i server su cui voglio eseguire lo script exp. E poi, mentre l'eof di host.txt, copia e incolla i comandi che sono nel file commands.txt in ogni host. – Tony

+0

che significa anche che il comando expect in questo script prevede un numero di host diversi, come $ host1->, $ host2-> etc .... – Tony

risposta

8

Il il codice dovrebbe leggere il contenuto dei due file in elenchi di righe, quindi scorrere su di essi. Si conclude in questo modo:

# Set up various other variables here ($user, $password) 

# Get the list of hosts, one per line ##### 
set f [open "host.txt"] 
set hosts [split [read $f] "\n"] 
close $f 

# Get the commands to run, one per line 
set f [open "commands.txt"] 
set commands [split [read $f] "\n"] 
close $f 

# Iterate over the hosts 
foreach host $hosts { 
    spawn ssh [email protected] 
    expect "password:" 
    send "$password\r" 

    # Iterate over the commands 
    foreach cmd $commands { 
     expect "% " 
     send "$cmd\r" 
    } 

    # Tidy up 
    expect "% " 
    send "exit\r" 
    expect eof 
    close 
} 

Si potrebbe refactoring questo un po 'con una procedura lavoratore o due, ma questa è l'idea di base.

2

avrei refactoring un po ':

#!/usr/bin/expect 

set timeout 20 
set user test 
set password test 

proc check_host {hostname} { 
    global user passwordt 

    spawn ssh [email protected]$hostname 
    expect "password" 
    send "$password\r" 
    expect "% "    ;# adjust to suit the prompt accordingly 
    send "some command\r" 
    expect "% "    ;# adjust to suit the prompt accordingly 
    send "exit\r" 
    expect eof 
} 

set fp [open commands.txt r] 
while {[gets $fp line] != -1} { 
    check_host $line 
} 
close $fp 
1

Utilizzando una delle due soluzioni qui, vorrei anche creare un file di registro che è possibile visualizzare in un secondo momento. Semplifica la risoluzione di eventuali problemi dopo l'esecuzione dello script, soprattutto se stai configurando diverse centinaia di host.

Add:

log_file -a [log nome file]

Prima che il ciclo.

Cheers,

K