2013-07-15 11 views
5

Was ich versuche zu tun ist, um:liest in String-Datei und eine Schleife tun in Script Erwarten

  1. erstellen .exp-Datei, die von der *.txt Datei aus demselben Verzeichnis und analysiert die gesamten Inhalt lesen in der Textdatei in eine String-Variable im Expect-Skript.
  2. Schleifen Sie die Zeichenfolge, die eine Reihe von Hostnamen enthält, und führen Sie eine Reihe von Befehlen aus, bis die Zeichenfolge aufgezählt ist.

Also, was das Skript hat, eine Reihe von Host-Namen aus einer txt-Datei im selben Verzeichnis gelesen wird, und sie dann in einen String gelesen, und die .exp Datei wird von ihnen Auto-Log in jeden und eine Reihe excecute von Befehlen.

Ich habe den folgenden Code geschrieben, aber es funktioniert nicht:

#!/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" 

Jede Hilfe wird sehr geschätzt ....

+0

Ich bin ein wenig verwirrt. Haben Sie eine Datei, die alle Befehle auflistet, und eine andere, die alle Hosts auflistet? Oder haben Sie ein Verzeichnis mit einer Datei pro Host (benannt nach Hostname mit der Erweiterung .txt?), In dem die Befehle auf diesem Host laufen? –

+0

Hallo. Ich versuche eine Schleife zu erstellen. Lesen Sie zuerst die Datei host.txt, die alle Server enthält, auf denen das exp-Skript ausgeführt werden soll. Kopieren Sie anschließend die Befehle, die sich in der Datei commands.txt befinden, in den Host. – Tony

+0

was auch bedeutet, dass der expect-Befehl in diesem Skript eine Anzahl verschiedener Hosts erwartet, wie zB $ host1->, $ host2-> etc .... – Tony

Antwort

8

Die Code sollte den Inhalt der zwei Dateien in Linienlisten lesen und dann über sie hinweg iterieren. Es endet wie folgt aus:

# 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 
} 

du ein bisschen mit einem Arbeiter Verfahren Refactoring könnte oder zwei, aber das ist die Grundidee.

2

ich ein wenig Refactoring würde:

#!/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

Mit einer der beiden Lösungen hier würde ich auch eine Logdatei erstellen, die Sie zu einem späteren Zeitpunkt anzeigen können. Erleichtert die Behebung von Problemen nach der Ausführung des Skripts, insbesondere wenn Sie mehrere hundert Hosts konfigurieren.

Anzahl:

log_file -a [Protokolldateiname]

Bevor Sie Ihre Schleife.

Cheers,

K