![]() |
Mit TIdTelnet Kommandos auf einem UNIX-Rechner
Hallo,
ich möchte/muß folgendes Problem lösen. Aus einem Delphi-Programm heraus soll auf einem UNIX-Rechner ein Shell-Kommando ausgeführt werden. Ich muß mich also anmelden mit User- und Kennwort-Eingabe. Offensichtlich ist aber das Programm zu schnell. Wenn ich diese Schritte einzeln anstoße funktioniert. Sobald aber die einzelnen Methodenaufrufe nacheinander stehen bleibt das Programm schon beim Senden des Login (mit WriteLn) hängen. :? |
Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
ich würde die Antworten vom server erwarten und auswerten.
Zuerst antwortet der Server mit 'Benutzername:' und dann mit 'Kennwort:'. Ich würde also erst den nächsten Part senden, wenn eine Antwort zurückkam. Das sind das bei dir übrigens ziemlich sicher andere Strings, ich hab an meiner Login-Shell ein wenig geändert ;-) |
Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
Das habe ich ja versucht. Aber offensichtlich sind die Methoden ReadLn und WriteLn dafür nicht geeignet.
|
Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
Hab gerade mal einen Test gemacht und es mit dem Event OnDataAvailabe hinbekommen. Hab mir hierfür ein paar Statusvariablen angelegt.
Getestet hab ich es mit AIX, evtl. musst Du die Strings noch anpassen. Gruß, Marcel
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdTelnet, StdCtrls; type TForm1 = class(TForm) IdTelnet1: TIdTelnet; Memo1: TMemo; Button1: TButton; Button2: TButton; procedure IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: String); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure IdTelnet1Connected(Sender: TObject); private { Private-Deklarationen } FUserSent: Boolean; FPassSent: Boolean; FCmdSent: Boolean; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.IdTelnet1Connected(Sender: TObject); begin FUserSent := False; FPassSent := False; FCmdSent := False; end; procedure TForm1.IdTelnet1DataAvailable(Sender: TIdTelnet; const Buffer: String); begin if (Pos('ogin:',Buffer) > 0) and not FUserSent then begin IdTelnet1.WriteLn('myusername'); FUserSent := True; end; if (Pos('ssword:',Buffer) > 0) and not FPassSent then begin IdTelnet1.WriteLn('mypassword'); FPassSent := True; end; if (Pos('user@machine /home/user>',Buffer) > 0) and not FCmdSent then begin IdTelnet1.WriteLn('ls -l'); FCmdSent := True; end; Memo1.Lines.Add(Buffer); end; procedure TForm1.Button1Click(Sender: TObject); begin IdTelnet1.Connect; end; procedure TForm1.Button2Click(Sender: TObject); begin IdTelnet1.Disconnect; Close; end; end. |
Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
Hallo Marcel,
ich habe jetzt leider ein Problem. Da der Telnet-Aufruf innerhalb einer Kommandozeilen-Anwendung laufen soll, wird des Telnet-Objekt schon zerstört, bevor die Kommandos fertig sind. Ich muß mir nun morgen überlegen, wie ich das abfange (irgendeine Warteschleife). :gruebel: |
Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
Warte doch im Event auf eine Meldung von Deinem Unix Kommando, dann wirds vorher nicht beendet.
Gruß, Marcel |
Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
Zitat:
|
Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
Hallo d3g,
bei dem Programm handelt es sich um eine Delphi 6-Anwendung. Und ich habe den unsauberen Trick gemacht, dass ich aus dem Hauptprogramm eine Form erzeuge. Ich weiß, das jetzt einigen OO-Profis die Haare zu Berge stehen. |
Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
Zitat:
Zitat:
|
Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz