Frage

Ich bin auto-Interaktion mit einer SSH-Sitzung und ein ERP-Programm erwartet.

Anstatt sich auf einen regulären Ausdruck unter Berufung eine Variable in meinem erwarten Skript zu erfassen wäre es möglich, auf einen bestimmten Tastendruck von einem Benutzer einen Bildschirmbereich zu erfassen, ein Feld sagen, in eine Variable im Code? Senden Sie den Server einige andere Befehle und senden Sie das Feld?

Say eine Auftragsnummer wird in 6 enthalten ist, 12, 6, 18 (wobei 6 die Reihe und 12-18 sind die Spalten) my 6-stellige Auftragsnummer enthält. Ich mag, dass Bestellnummer von Zeile erhalten 6 Spalten 12 bis 18 Kopie, die in eine Variable. Dann kann der Benutzer einige mehr (oder erwarten einen Umzug in ein anderes Menü) kommunizieren, sich dann erneut senden die Bestellnummer in einem anderen Menü.

Also ich meine Frage erraten ist: Sind die Inhalte des aktuellen Bildschirm in einem Puffer? (Nicht die ganze Sitzung) Können Sie extrahieren nur ein bestimmtes Datenelement, das nur in dieser Zeile und Spalte-Bereich auf dem Bildschirm existieren würde?

Beispiel Pseudo-Code:

#!/usr/bin/expect -f
set env(TERM) vt100
spawn ssh -Y user@domain
#... set user/pass and other vars...
#... send commands to log into ERP
#don't time out
set timeout -1 
        interact {
                -reset $CTRLZ {exec kill -STOP [pid]}
                $CTRLA   {   
                        exp_send "menu_address\ry\r"
                }
                $CTRLO   {   
                        #...acquire order number variable...
                        #...some code I don't understand yet...

                        exp_send "menu_exit_sequence\r"
                        exp_send "menu_address\r"
                        exp_send $ordernumvar

                }
                ~~
        }
War es hilfreich?

Lösung

Nein, kann man nicht greift etwas aus dem Bildschirm in einer bestimmten Zeile / Spalte. Aber darüber nachdenken, wie die Informationen auf den Bildschirm in dem ersten Platz. Wenn es eine tty-basierte Anwendung ist Flüche mit war es auf stdout mit speziellen Escape-Sequenzen, die es verursachten in dieser Zeile / Spalte angezeigt werden. Also, ‚erwarten‘, jene spezifische Escape-Sequenzen zu bekommen, was in dieser Position ist.

Andere Tipps

Eigentlich das term_expect Beispielprogramm, das mit Erwarten kommt, kann dies tun genau. Er emuliert eine Cursor-adressierbaren Endgerät und ermöglicht es Ihnen, Testausgang an bestimmten Bildschirmpositionen. In meiner ActiveTcl Verteilung ist es in demos / Expect / term_expect.

Um die Debug-Ausgabe meines ERP Ich fand ich verwenden könnte exp_internal Ausgabezeichen zu erhalten.

exp_internal -f file 0

Der Ausgang das gab mir: (meine Nummer 076338 eingegeben werden)

spawn id exp0 sent <0>^M
spawn id exp6 sent <0>^M
spawn id exp0 sent <7>^M
spawn id exp6 sent <7>^M
spawn id exp0 sent <6>^M
spawn id exp6 sent <6>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <3>^M
spawn id exp6 sent <3>^M
spawn id exp0 sent <8>^M
spawn id exp6 sent <8>^M
spawn id exp0 sent <\r>^M
spawn id exp6 sent <\r\n\u001b[1;14H>^M

So, jetzt muss ich herauszufinden, die regex das Feld zu bekommen. Ich hatte dies:

-nobuffer -re {^([a-zA-Z0-9]{1})?[0-9]{5}$} {
    set ordernumber $interact_out(0,string)
}

aber jetzt brauche ich diese zu übernehmen:

^([a-zA-Z0-9]{1})?[0-9]{5}

Mit einigen regex, die diese darstellen würde:

\r\n\u001b[1;14H

Und dann, wenn ich, dass in der $ Bestellnr Variable gespeichert haben, muss ich irgendwie isolieren nur die Zeichen vor der Beendigung String und speichern die in einer Variablen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top