2016-11-23 2 views
-1

Ich brauche ein Skript, um die gleichen Daten in mehreren Servern zu ändern. Jetzt erzeugt die for-Schleife die Befehlszeilen, aber ich habe einige Probleme mit expect und pssh.für Schleife, expect und pssh

Die for-Schleife:

<code> 
    for ((var1=1;var1<=14; var1++)) 
    { 
     cda stm add "$var1/$var2/$var3" ss 1 
     for ((var2=1;var2<=8;var2++)) 
     { 
      cda stm add "$var1/$var2/$var3" ss 1 
      for ((var3=1; var3<64; var3++)) 
      { 
       cda stm add "$var1/$var2/$var3" ss 1 
      } 
     } 
    } 
</code> 

ich pssh in erwarten Skript bin stattdessen ssh.

Der vollständige Code:

<code> 

    #!/usr/bin/expect 

    set timeout 20 

    set ip [lindex $argv 0] 
    set user [lindex $argv 1] 
    set password [lindex $argv 2] 

     for ((var1=1;var1<=14; var1++)) 
{ 
    cda stm add "$var1/$var2/$var3" ss 1 
    for ((var2=1;var2<=8;var2++)) 
    { 
     cda stm add "$var1/$var2/$var3" ss 1 
     for ((var3=1; var3<64; var3++)) 
     { 
      cda stm add "$var1/$var2/$var3" ss 1 
     } 
    } 
}   
    spawn pssh "$user\@$ip" 

    expect "yes/no" { 
      send "yes\r" 
      expect "*?assword" { send "[lindex $argv 2]\r" } 
      } "*?assword" { send "[lindex $argv 2]\r" } 
      expect "SH" 

    interact 
</code> 

Ich erhalte die folgende Fehlermeldung:

<code> 
wrong # args: should be "for start test next command" 
    while executing 
"for ((var1=1" 
    (file "./ssh" line 9) 
</code> 
+0

nicht klar, was Ihre Frage ist? Was sind die Probleme, die Sie erleben? Es wird hilfreich sein, es sowohl in der Überschrift als auch in der Kopfzeile zu klären –

+0

Hallo Amittai Shapira, das Problem ist die for-Schleife in einem Expect-Skript. Der Erwartungswert hört auf zu arbeiten oder funktioniert nicht. –

+0

Sie müssen wahrscheinlich weitere Informationen hinzufügen - wann hat es aufgehört zu arbeiten? Was war der Fehler? –

Antwort

0

for Schleifen erwarten und Tcl haben wie folgt aussehen:

for {set var1 1} {$var1<=14} {incr var1} { 
    commands... 
} 

In Mit anderen Worten, der for Befehl erfordertvier Argumente: der Startcode, die Bedingung, der "nächste" Code und der Schleifenkörper. Beachten Sie, dass Zeilenumbrüche in Tcl Befehlsseparatoren sind. Daher muss die offene Klammer für den Schleifenkörper in derselben Zeile wie der Befehl for sein (oder Sie müssen eine Backslash-Zeilenumbruch-Zeilenfortsetzung verwenden).

Sie haben stattdessen die bash/ksh-Syntax verwendet.

0

Neben den Syntaxfehlern in for-Schleife, gibt es ein logisches Problem mit dem Code-Schnipsel in der Frage:

  • var2 für den Druck in der äußersten Schleife nicht verfügbar ist (zum ersten Mal).
  • var3 ist nicht zum Drucken in der 2. Schleife (zum ersten Mal) verfügbar.

Hier ist wahrscheinlich das, was Sie brauchen:

for {set var1 1} {$var1 <=14} {incr var1} { 
    puts "LEVEL_1: $var1" 
    # cda stm add "$var1" ss 1 
    for {set var2 1} {$var2 <=8} {incr var2} { 
     puts "LEVEL_2: $var1/$var2" 
     # cda stm add "$var1/$var2" ss 1 
     for {set var3 1} {$var3 <64} {incr var3} { 
      puts "LEVEL_3: $var1/$var2/$var3" 
      # cda stm add "$var1/$var2/$var3" ss 1 
     } 
    } 
}