PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : telnet-Zugriff automatisieren



Stingray0481
23-02-2003, 10:15
Hi,

gibt es eine Möglichkeit ein Skript (evtl. auch ein kleines C++-Programm) zu schreiben, dass einen Telnet-Login automatisiert?
Ich habe zwar hier im Forum schon 2 oder 3 Beiträge dazu gelesen aber dort wurden meist spezielle Alternativlösungen gepostet.

Ein Ansatz war z.B.

echo <Befehl> | telnet localhost <port>

Ich würde allerdings gerne mehrere Befehle ausführen und die Ausgabe in eine Datei umleiten.

Hintergrund:
Ich hätte gerne ein Skript, das per Cronjob ausgeführt wird, sich lokal bei MLDonkey einloggt, dort mehrere Befehle (z.B. "vd", "vm") ausführt und die Ausgabe in eine Datei schreibt, die mir dann per Email geschickt wird.

Grüße, Matthias

JoelH
23-02-2003, 10:41
also mit Ruby kannste sowas sehr einfach lösen, da gibt es eine gute Telnetbibliothek schon relativ fest eingebaut.

anda_skoa
23-02-2003, 11:42
Wenn das mit echo klappt, kannst du wahrscheinlich auch eine Datei mit Befehlen durch die Pipe schicken

#> cat commands | telnet .... > out.log

Ciao,
_

Stingray0481
23-02-2003, 17:11
Das mit dem "echo" klappt leider auch im einfachsten Fall bei mir nicht.
Ich habe es nun mal mit Ruby versucht, was soweit auch funktioniert. Ich habe nur das Problem, dass das Skript nach dem ersten "host.cmd"- Befehl, welcher noch korrekt ausgeführt wird, nach der eingestellten Wartezeit mit folgender Fehlermeldung abbricht:

/usr/lib/ruby/1.6/net/telnet.rb:465:in `waitfor': timed-out; wait for the next data (TimeoutError)
from /usr/lib/ruby/1.6/net/telnet.rb:552:in `cmd'
from test.rb:7

Die "cmd"-Funktion scheint auf irgendeinen Prompt zu warten, den sie nicht bekommt.

"Prompt" => /[$%#>] \z/n,

Obige Definition ist default, mir ist allerdings nicht klar was das Prompt bewirken soll. Da ich mich mit Ruby nicht auskenne sagt mir auch "/[$%#>] \z/n," nichts.

Kann mir an der Stelle jemand weiterhelfen?


require 'net/telnet'
host = Net::Telnet::new(
{"Host" => "localhost",
"Timeout" => 3,
"Port" => 4000,
"Prompt" => /[$%#>] \z/n,
"Output_log" => "output_log"})
host.cmd("vd"){ |c| print c }
# weitere Befehle werden nicht ausgeführt
host.cmd("q"){ |c| print c }

TheDodger
25-02-2003, 10:01
fehlt da evtl. ein abschließendes 'return' ?

Stingray0481
25-02-2003, 13:22
Meinst du das Wort "return" irgendwo im Quelltext (wenn ja, was soll das bedeuten?), oder die Taste <Return> am Ende. (Kann ich mir nicht vorstellen, da er gar nicht bis zum Ende kommt)

TheDodger
07-03-2003, 07:13
Ich meinte das zeichen 'return' ... also ein '\n' am ende der zeile, die du übertragen willst.

Stingray0481
07-03-2003, 17:32
Nee, ich habe es mal ausprobiert. Das ist es aber nicht. Der erste Befehl wird ja auch noch klaglos ausgeführt. Wenn das "\n" fehlen sollte, dann würde der erste Befehl ja schon nicht ausgeführt werden.
Irgendwie scheint der MLDonkey Telnetzugriff nicht 100% kompatibel zu einen normalen Telnetlogin zu sein. Das Skript funktioniert (leicht angepasst) bei einem normalen Telnetserver.