Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Mit TIdTelnet Kommandos auf einem UNIX-Rechner (https://www.delphipraxis.net/15417-mit-tidtelnet-kommandos-auf-einem-unix-rechner.html)

r_kerber 28. Jan 2004 14:00


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. :?

Phoenix 28. Jan 2004 14:05

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 ;-)

r_kerber 28. Jan 2004 17:05

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.

Marcel Gascoyne 29. Jan 2004 13:06

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.

r_kerber 29. Jan 2004 16:26

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:

Marcel Gascoyne 29. Jan 2004 19:01

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

d3g 29. Jan 2004 19:29

Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
 
Zitat:

Zitat von r_kerber
Da der Telnet-Aufruf innerhalb einer Kommandozeilen-Anwendung laufen soll,

Hm? Hab ich was verpasst? Komponenten in einer Kommandozeilenanwendung? Wie hast du das denn hingekriegt? Funktioniert in Delphi 8 das Erstellen von Komponenten mit nil als Parent?

r_kerber 29. Jan 2004 20:09

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.

d3g 30. Jan 2004 11:02

Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
 
Zitat:

Zitat von r_kerber
Und ich habe den unsauberen Trick gemacht, dass ich aus dem Hauptprogramm eine Form erzeuge.

Damit dürftest du aber Probleme bekommen, wenn das grafische Subsystem nicht geladen ist. Dann kann man dein Programm nicht starten.

Zitat:

Zitat von r_kerber
Ich weiß, das jetzt einigen OO-Profis die Haare zu Berge stehen.

Nicht nur OO-Profis, auch mir ;-)

r_kerber 30. Jan 2004 11:27

Re: Mit TIdTelnet Kommandos auf einem UNIX-Rechner
 
Zitat:

Zitat von d3g
Damit dürftest du aber Probleme bekommen, wenn das grafische Subsystem nicht geladen ist. Dann kann man dein Programm nicht starten.

Die brauche ich doch eigentlich nicht, da ich die Form nur erzeuge.
Zitat:

Zitat von d3g
Zitat:

Zitat von r_kerber
Ich weiß, das jetzt einigen OO-Profis die Haare zu Berge stehen.

Nicht nur OO-Profis, auch mir ;-)

Mir übrigens auch. Nur ist mir unter Zeitdruck keine bessere Lösung eingefallen. Ich bin für jeden Tip dankbar. :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz