fragen stichworte

Erwarten Sie Skript, Timeouts und Fehlerprüfung

Ich hatte gehofft, einen kleinen Einblick in ein erwartetes Skript zu bekommen, das ich geschrieben habe.

Grundsätzlich wird erwartet, dass dieses Skript einen Sftp-Upload durchführt, die Schlüsselauthentifizierung ist keine Option, und Sftp ist die einzige von unserem Hersteller unterstützte Methode. Daher ist dies erforderlich.

Ich möchte Timeouts abfangen und einen Fehlercode zu Skriptzwecken protokollieren.

Ich muss:

  • Melden Sie sich bei der sftp-Site an
  • Beginnen Sie mit der Übertragung
  • Stellen Sie fest, dass der Upload 100% erreicht hat
  • Wenn der Upload nicht innerhalb einer bestimmten Zeit 100% erreicht, möchte ich einen Fehlercode für protokollieren Skripting-Zwecke.

Folgendes habe ich bisher:

set timeout 10
spawn sftp user@xxx.xxx.xxx.xxx
match_max 100000
expect "password: "
send -- "PASSWORD\\n"
expect "sftp> "
send -- "lcd/data/upload\\n"
expect "sftp> "
send -- "put file_yyyymmdd\\n"
expect "*100%*" {send "quit\\n" } \\
timeout { exit 2 }
expect "sftp> "
send -- "quit\\n"
expect eof

Ich glaube, der Code läuft bis zum Timeout. Unten ist das Protokoll der Expect-Sitzung:

spawn sftp user@xxx.xxx.xxx.xxx
user@xxx.xxx.xxx.xxx's password: 
Connected to xxx.xxx.xxx.xxx.
sftp> lcd/data/upload/
sftp> put file_yyyymmdd
Uploading file_yyyymmdd to/home/user/file_yyyymmdd
file_yyyymmdd                                 0%    0     0.0KB/s   --:-- ETA
file_yyyymmdd                               100% 5835     5.7KB/s   00:00    
quit
sftp> quit

Es scheint, dass das "Quit" zweimal gesendet wird? Was ich denke, macht b/c die 100% und sendet sofort das "Quit", bevor die Eingabeaufforderung fertig ist.

Welche Änderungen sollte ich vornehmen, um meine erwarteten Ergebnisse zu erhalten?

Jede Hilfe wäre sehr dankbar.

In einem anderen Hinweis möchte ich dieses Expect-Skript erweitern oder ein anderes erstellen, das erkennt, wenn sich der DES-Schlüssel geändert hat, es akzeptieren (Ja senden) und fortfahren.

Allerdings würde ich gerne wissen, wann dies geschieht, entweder mit einem Fehlercode oder Schreiben von etwas in eine Protokolldatei ...

Ich habe Folgendes versucht, aber es funktioniert nicht wie erwartet:

set timeout 10
spawn sftp user@xxx.xxx.xxx.xxx
match_max 100000
expect "Are you sure you want to continue connecting (yes/no)? " {send "yes\\r" } \\\\
timeout { exit 0 }
sleep 2
exit 3
expect eof

Der Gedanke war, die Exit-Codes zu verwenden, um zu bestimmen, ob der Schlüssel aktualisiert werden musste. Er kommt jedoch immer als Exit-Code 3 (Schlüssel geändert) zurück und sendet kein "Ja", wenn der Schlüssel tatsächlich geändert wurde.

Auch hier wäre jede Hilfe sehr dankbar.

antworten

Für die Zeitüberschreitung:

expect "*100%*" {send "quit\\n" } \\
timeout { exit 2 }
expect "sftp> "
send -- "quit\\n"
expect eof

sollte zu (auch aus Gründen der Übersichtlichkeit anders formatiert) geändert werden

expect {
  "*100%*" { } 
  timeout { exit 2 }
}
expect "sftp> "
send -- "quit\\n"
expect eof

Der Abschnitt "*100%*" { } sagt ihm, dass er die expect-Anweisung verlassen und in die nächste Zeile wechseln soll:

expect "sftp> "

Bei der Änderung des DES-Schlüssels muss möglicherweise die Klammer umbrochen werden. Versuchen Sie exp_internal 1 in Ihrem Skript zu setzen, um bessere Debugging-Nachrichten zu sehen. Es stimmt möglicherweise nicht richtig überein.

edit: Es könnte auch der Platz am Ende sein.