2016-03-28 11 views
1

Ich kann keine Befehle auf dem Remote-Host ausgeführt unter Verwendung erwarten script.It nur auf dem Remote-Host anmeldet und exits.Here ist der Codenicht in der Lage mit Fern ssh Befehle auszuführen erwarten Skript

#!/usr/bin/expect 
set timeout 15 
puts "connecting to the storage\n" 
set user [lindex $argv 0] 
set host [lindex $argv 1] 
set pass "root123" 
spawn ssh "$user\@$host" 
expect { 
"Password: " { 
send "$pass\r" 
sleep 1 
expect { 
"$ " { 
    send "isi quota quotas list|grep ramesh\r" } 
"$ " { 
    send "exit\r" } 

} 
} 
"(yes/no)? " { 
send "yes\r" 
expect { 
"$ " { send "ls\r" } 
"$ " { send "exit\r" } 

"> " {} 
} 
} 
default { 
send_user "login failed\n" 
exit 1 
} 
} 

Es wird nur in den Remote-Host und beendet. [tief @ host1: ~] $ ./sshexpect benutzer1 host2 Anschluss an die Speicher

spawn ssh [email protected] 
Password: 
host2$ 
[[email protected]:~]$ 

Ist die Syntax falsch? Ich bin neu in Tcl Scripting.

Antwort

1

Einrückungen würden viel helfen:

expect { 
    "Password: " { 
     send "$pass\r" 
      sleep 1 
      expect { 
       "$ " { send "isi quota quotas list|grep ramesh\r" } 
       "$ " { send "exit\r" } 
      } 
    } 
    "(yes/no)? " { 
     send "yes\r" 
      expect { 
       "$ " { send "ls\r" } 
       "$ " { send "exit\r" } 
       "> " {} 
      } 
    } 
    default { 
     send_user "login failed\n" 
      exit 1 
    } 
} 

Das Problem ist hier:

  expect { 
       "$ " { send "isi quota quotas list|grep ramesh\r" } 
       "$ " { send "exit\r" } 
      } 

Sie das gleiche Muster passende zweimal: Ich erwarte vermuten ist, den ersten Aktionsblock ignoriert, und nur den 2. verwenden; So beenden Sie sofort.

Dies ist, was Sie tun möchten:

expect { 
    "(yes/no)? " { send "yes\r"; exp_continue } 
    "Password: " { send "$pass\r"; exp_continue } 
    timeout  { send_user "login failed\n"; exit 1 } 
    -re {\$ $} 
} 
send "isi quota quotas list|grep ramesh\r" 

expect -re {\$ $} 
send "ls\r" 

expect -re {\$ $} 
send "exit\r" 

expect eof 
+0

ich den Fehler verstanden, aber ich nicht bekommen, was tut die unterhalb der Linie steht für -re {\ $ $} Und auch, warum brauchen wir put erwarten eof am Ende des Skripts – anudeep

+0

Die '-re' Option verwendet regulären Ausdruck Muster anstelle der Standard-Glob-Muster. Ich gebe an, dass die Eingabeaufforderung ein Dollarzeichen und ein Leerzeichen * am Ende der Zeile * ist. Wenn expect ein Dollarzeichen und ein Leerzeichen und dann einen anderen Text sieht, wird das nicht als Aufforderung angezeigt. 'expect eof' bedeutet im Grunde genommen" warte, bis der erzeugte Prozess abgeschlossen ist "- hier nicht unbedingt notwendig, aber in der Regel gute Praxis. –

+0

Ich habe versucht, das funktioniert immer noch nicht für mich.Es zeigt die "Anmeldung fehlgeschlagen" und beendet. Es meldet sich nur in der Remote-Box und dann leer und nach einiger Zeit mit "Login fehlgeschlagen" – anudeep