![]() |
|
Linux - Wegweiser für NetzwerkerOnline-VersionCopyright © 2001
by O'Reilly Verlag GmbH & Co.KG Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen. Wünschen Sie mehr Informationen zu der gedruckten Version des Buches Linux - Wegweiser für Netzwerker oder wollen Sie es bestellen, dann klicken Sie bitte hier. |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Eine Sache, die Sie in unserem obigen Beispiel vielleicht als unbequem betrachten könnten, ist, daß Sie die Verbindung zuerst manuell aufbauen müssen, bevor Sie pppd starten können. Leider besitzt pppd im Gegensatz zu dip keine eigene Skriptsprache, mit der Sie die Gegenstelle anwählen und sich einloggen können, sondern ist von einem externen Programm oder Shell-Skript abhängig, das diese Aufgabe übernimmt. Der entsprechende Befehl kann pppd mit der Kommandozeilenoption connect übergeben werden. pppd leitet die Standardein- und -ausgabe des Programms dann an die serielle Leitung um.
Das Softwarepaket von pppd enthält ein sehr einfaches Programm namens chat, mit dem Sie Login-Sequenzen auf die eben beschriebene Weise automatisieren können. Damit beschäftigen wir uns noch etwas ausführlicher.
Wenn Ihre Login-Sequenz komplex ist, brauchen Sie etwas Besseres als chat. Eine sehr interessante Alternative ist expect, das von Don Libes geschrieben wurde. Es hat eine sehr mächtige Tcl-basierte Programmiersprache und wurde genau für diese Zwecke entworfen. All diejenigen unter Ihnen, deren Login-Vorgang z.B. eine Frage/Antwort-(Challenge/Response-)Authentifizierung erfordert, bei der rechenintensive Schlüsselgeneratoren zum Einsatz kommen, werden feststellen, daß expect ein Werkzeug ist, das dieser Aufgabe gewachsen ist. Nun gibt es aber dabei so viele verschiedene Varianten, daß wir in diesem Buch nicht darauf eingehen, wie man so ein Skript schreibt. Eigentlich brauchen Sie nur zu wissen, wie man ein expect-Skript startet, nämlich durch Angabe seines Namens zusammen mit der connect-Option von pppd. Wichtig ist zu beachten, daß die Standardeingabe und -ausgabe auf das Modem umgelenkt werden, solange das Skript läuft, und nicht etwa auf das Terminal, auf dem der pppd-Dämon gestartet wurde. Wenn Sie in dieser Zeit Benutzeraktivitäten gestatten wollen, müssen Sie auf ein freies virtuelles Terminal umschalten oder andere Möglichkeiten bereitstellen.
Mit dem Programm chat können Sie Chat-Skripten ausführen, wie sie auch von UUCP verwendet werden. Grundsätzlich besteht ein Chat-Skript aus einer abwechselnden Folge von Zeichenketten, die wir vom entfernten System erwarten, sowie den Antworten, die auf diese Strings übertragen werden sollen. Wir nennen sie expect-Strings (die erwarteten Zeichenketten) und send-Strings (die zu übertragenden Zeichenketten). Nachfolgend ein typischer Ausschnitt aus einem Chat-Skript:
ogin: b1ff ssword: s3|<r1t
Dieses Skript weist chat an, darauf zu warten, bis die andere Seite den Login-Prompt gesendet hat, und dann den Login-Namen b1ff zurückzuschicken. Wir warten nur auf ogin:, so daß es keine Rolle spielt, ob der Login-Prompt mit einem großen oder kleinen “l” oder sonst was beginnt. Der folgende String ist eine weitere Zeichenfolge, auf die chat warten soll. Sobald sie eingeht, wird unser Paßwort als Antwort übertragen.
Das ist im Grunde schon alles, was es zu Chat-Skripten zu sagen gibt. Ein vollständiges Skript, mit dem Sie einen PPP-Server anwählen würden, müßte natürlich auch die entsprechenden Modembefehle enthalten. Angenommen, Ihr Modem versteht den Hayes-Befehlssatz, und die Telefonnummer des Servers lautet 318714. Die vollständige Befehlszeile, mit der chat die Verbindung zu c3po aufbaut, wäre dann:
$
chat -v ’’ ATZ OK ATDT318714 CONNECT ’’ ogin: ppp word: GaGariN
Per Definition wird zuerst ein Expect-String erwartet, aber weil das Modem nichts sagen würde, wenn wir nicht ein wenig nachhelfen würden, veranlassen wir chat, den ersten Expect-String zu überspringen, indem wir einen leeren String angeben. Wir machen weiter und senden ATZ, den Reset-Befehl für Hayes-kompatible Modems, und warten auf die entsprechende Antwort (OK). Der nächste String sendet den Wählbefehl zusammen mit der gewünschten Telefonnummer an chat und erwartet die Nachricht CONNECT als Antwort. Dem folgt wieder ein leerer String, weil wir nun nichts mehr senden wollen, sondern nur noch auf den Login-Prompt warten. Der Rest des Skripts arbeitet genauso, wie bereits oben beschrieben. Diese Beschreibung ist vielleicht ein wenig verwirrend, wir werden aber in Kürze sehen, daß es einen Weg gibt, Chat-Skripten leichter verständlich zu gestalten.
Mit der Option –v weisen Sie chat an, alle Aktivitäten über den local2-Kanal des syslog-Dämons zu protokollieren.1
Die Angabe des Chat-Skripts auf der Kommandozeile birgt ein gewisses Risiko, weil Benutzer sich die Kommandozeilen laufender Prozesse mit dem ps-Befehl ansehen können. Sie können dieses Risiko vermeiden, indem Sie das Skript in einer Datei, z.B. dial-c3po, speichern. Mit der Option –f (gefolgt vom Dateinamen) können Sie chat dann anweisen, das Skript aus dieser Datei zu lesen. Dieses Verfahren hat zudem den Vorteil, unsere Chat-Expect-Sequenzen leichter verständlich zu machen. Auf unser Beispiel übertragen, würde unsere dial-c3po-Datei so aussehen:
’’ ATZ OK ATDT318714 CONNECT ’’ ogin: ppp word: GaGariN
In einem solchen Chat-Skript stehen alle erwarteten Texte links und die darauf zu sendenden Antworten rechts davon. Es ist offensichtlich, daß Chat-Skripten in dieser Form erheblich leichter zu verstehen sind.
Die vollständige pppd-Anweisung wäre nun wie folgt:
#
pppd connect "chat -f dial-c3po" /dev/ttyS3 38400 -detach \ crtscts modem defaultroute
Neben der Option connect, mit der das Skript bestimmt wird, haben wir noch zwei weitere Optionen in die Kommandozeile aufgenommen: zum einen -detach, mit der pppd angewiesen wird, sich nicht von der Konsole zu trennen und ein Hintergrundprozeß zu werden, zum anderen modem, wodurch modemspezifische Aktionen auf dem seriellen Gerät durchgeführt werden, beispielsweise die Unterbrechung der Leitung vor und nach jedem Anruf. Wenn Sie diese Option nicht verwenden, überwacht pppd nicht die DCD-Leitung des Ports und kann dann nicht erkennen, wenn das Gegenüber unvermittelt die Verbindung unterbricht.
Die obigen Beispiele waren ziemlich einfach; mit chat können Sie jedoch auch wesentlich kompliziertere Skripten erstellen. Mit chat kann man beispielsweise einen String angeben, bei dem mit einer Fehlermeldung abgebrochen wird. Typische Strings sind Meldungen wie BUSY oder NO CARRIER, die normalerweise von Ihrem Modem erzeugt werden, wenn die gewählte Nummer besetzt ist oder nicht antwortet. Damit chat diese Nachrichten direkt erkennt und nicht erst auf den Timeout wartet, können Sie sie zusammen mit dem Schlüsselwort ABORT an den Anfang Ihres Skripts stellen:
$
chat -v ABORT BUSY ABORT ’NO CARRIER’ ’’ ATZ OK ...
Auf ähnliche Weise können Sie den Timeout-Wert für Teile des Chat-Skripts ändern, indem Sie entsprechende TIMEOUT-Optionen einfügen.
Manchmal sollen auch Teile des Skripts nur ausgeführt werden, wenn eine bestimmte Bedingung erfüllt ist. Wenn Sie zum Beispiel den Login-Prompt vom anderen Ende nicht empfangen können, wollen Sie möglicherweise ein BREAK oder einen Wagenrücklauf übertragen. Sie erreichen dies, indem Sie ein Subskript an einen Expect-String anhängen. Dieses besteht — genau wie bei einem normalen Skript — auch aus einer Reihe von Send- und Expect-Strings, die durch Bindestriche voneinander getrennt sind. Das Subskript wird immer dann ausgeführt, wenn der erwartete String, dem es anhängt, nicht innerhalb der vereinbarten Zeit eintrifft. Im obigen Beispiel würden Sie das Skript wie folgt modifizieren:
ogin:-BREAK-ogin: ppp ssword: GaGariN
Empfängt chat nun vom entfernten System nicht den Login-Prompt, wird das Subskript ausgeführt. Dabei wird zuerst ein BREAK übertragen, und danach wird erneut auf den Login-Prompt gewartet. Erscheint der Prompt nun, läuft das Skript weiter, als wäre nichts gewesen; ansonsten wird es mit einem Fehler abgebrochen.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Weitere Informationen zum Linux - Wegweiser für Netzwerker
Weitere Online-Bücher & Probekapitel finden Sie in unserem Online Book Center
© 2001, O'Reilly Verlag