Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Conexión mediante telnet (https://www.clubdelphi.com/foros/showthread.php?t=93046)

koalasoft 28-04-2018 02:04:38

Conexión mediante telnet
 
Estimados, he decidido aumentar mas mi sistema en cuanto a procesos, para esto manualmente me conecto en una terminal via Telnet para ejecutar unos comando para dar de alta a equipos, en la aplicación que hice, genero los códigos necesarios para que cuando me conecte via telnet a ese equipo solo copie de la aplicación esos códigos y los pegue en la terminal de telnet. Pero dije, bueno por que no hacerlo desde la aplicación mejor .. y me puse a investigar ... estoy en pruebas ...

Los enlaces que pusieron muy bueno y en eso me base !! .

Puedo con ese ejemplo conectarme perfectamente .. pero todo lo hago manual nuevamente pues seria una terminal propia... lo que busco es que una vez que me conecte a la terminal via telnet pueda enviar comandos a ese equipo via telnet ...

Al conectarme por ese emplo me pide en el servidor donde me conecto la clave y contraseña ... puse 2 Edit1 (el usuario) y Edit2 (contraseña) ... o que ahora intento es tratar de que esos datos sean enviados vía telnet desde la aplicación para poder estar logeado..

Para conectarme tengo esto ..

Código PHP:

procedure TForm1.Button1Click(SenderTObject);
begin
  Telnet
.Host := IPServidor.Text;
  
Telnet.Port := StrToIntPuerto.Text );
  
Telnet.Connect;
  
Log.SetFocus;
end

En el evento OnConnect:

Código PHP:

procedure TForm1.TelnetConnect(SenderTObject);
begin
Log
.Lines.Add'Conectando con ' Telnet.Host '.' );
Log.Lines.Add'' );
Telnet.WriteLn(Trim(Edit1.Text)+#13);
Telnet.WriteLn(Trim(Edit2.Text)+#13);
end

y Aqui es donde envío los datos hacia la terminal ... pero veo que cuando lo hago de esta forma me toma solo el edit2 (clave) y deberia poner primero el usuario (edit) y después la contraseña ..

Alguna idea de que puede ser o que otra solución podria darse ? ..

Uso Delphi7 (si todavía)...

orodriguezca 28-04-2018 15:28:38

Lo más aconsejable para automatizar la interacción con una sesión telnet es colocar un sniffer para "ver" el flujo de caracteres que se intercambian con el servidor a medida que se ejecutan las diferentes acciones y así poder duplicar eso mismo desde nuestra aplicación. La mayoría de los servidores telnet inmediatamente, después de establecer la conexión, quedan esperando que se le envíe el usuario, a lo que el servidor responde con una petición de contraseña; es solo en este momento en que se puede enviar la contraseña.

En algunos servidores telnet es posible enviar el usuario y la contraseña separando ambos con el ascii 9 (caracter tab). En el caso de tu código sería:

Código Delphi [-]
procedure TForm1.TelnetConnect(Sender: TObject); 
begin 
  Log.Lines.Add( 'Conectando con ' + Telnet.Host + '.' ); 
  Log.Lines.Add( '' ); 
  Telnet.WriteLn(Trim(Edit1.Text) + #9 +Trim(Edit2.Text));  
end;

Pero que lo anterior funcione o no depende de la implementación del servidor.

koalasoft 28-04-2018 18:52:28

Cita:

Empezado por orodriguezca (Mensaje 525946)
Lo más aconsejable para automatizar la interacción con una sesión telnet es colocar un sniffer para "ver" el flujo de caracteres que se intercambian con el servidor a medida que se ejecutan las diferentes acciones y así poder duplicar eso mismo desde nuestra aplicación. La mayoría de los servidores telnet inmediatamente, después de establecer la conexión, quedan esperando que se le envíe el usuario, a lo que el servidor responde con una petición de contraseña; es solo en este momento en que se puede enviar la contraseña.

En algunos servidores telnet es posible enviar el usuario y la contraseña separando ambos con el ascii 9 (caracter tab). En el caso de tu código sería:

Código Delphi [-]
procedure TForm1.TelnetConnect(Sender: TObject); 
begin 
  Log.Lines.Add( 'Conectando con ' + Telnet.Host + '.' ); 
  Log.Lines.Add( '' ); 
  Telnet.WriteLn(Trim(Edit1.Text) + #9 +Trim(Edit2.Text));  
end;

Pero que lo anterior funcione o no depende de la implementación del servidor.


En mi caso al conectarse al servidor te pide primero el usuario y después de esto la contraseña, intenté hacerlo como su ejemplo per veo que no envia el dato del Edit1 a la terminal ya que al conectarse solicita el usuario. intente con el ascii 13 (enter) ya que al ingresar anualmente el usuario hay que pulsar enter lo mismo que la contraseña..

koalasoft 28-04-2018 22:40:52

Mi problema radicaba en que al envia datos a la terminal era demasiado rápido y solo ejecutaba el ultimo comando enviado, asi que decidí utilizar el sleep para darle oportunidad de poder conectarme ...

Código Delphi [-]
procedure TForm1.BtnConectarClick(Sender: TObject);
begin
  Telnet.Host := IPServidor.Text;
  Telnet.Port := StrToInt( Puerto.Text );
  try
  Telnet.Connect;
  log.Lines.Add('Intentando conexión...');
  log.Lines.Add('');
  except
    ShowMessage('No se pudo realizar la conexión..');
    Exit;
  end;
end;

y una vez conectado envío los los datos de unicio (usuario y contraseña) seguido de los comando que requiero...

Evento OnConnect del componente TidTelnet

Código Delphi [-]
if Telnet.Connected then
  begin
    log.Lines.Add('Conectado...') ;
    log.Lines.Add('') ;
    Sleep(1000);
    Telnet.WriteLn('root');
    Sleep(1000);
    Telnet.WriteLn('admin');
    Sleep(1000);
    Telnet.WriteLn('enable');
    Sleep(1000);
    Telnet.WriteLn('config');
    Sleep(1000);
  end
    else
      begin
        log.Lines.Add('Error en la Conección...') ;
        log.Lines.Add('') ;
      end;

Requerido para que el cursor en la terminal se posicione en la ultima linea de la ultima columna para que este preparado para nuevos comando..

Evento OnDataAvailable del componente TIdTelnet

Código Delphi [-]
procedure TForm1.TelnetDataAvailable(Sender: TIdTelnet;
  const Buffer: String);
{This routine comes directly from the ICS TNDEMO code. Thanks to
Francois Piette
It updates the memo control when we get data}
const
    CR = #13;
    LF = #10;
var
    Start, Stop : Integer;
begin
  if Log.Lines.Count = 0 then
      Log.Lines.Add('');
 
  Start := 1;
  Stop  := Pos(CR, Buffer);
  if Stop = 0 then
      Stop := Length(Buffer) + 1;
  while Start <= Length(Buffer) do
  begin
      Log.Lines.Strings[Log.Lines.Count - 1] :=
          Log.Lines.Strings[Log.Lines.Count - 1] +
          Copy(Buffer, Start, Stop - Start);
      if Buffer[Stop] = CR then
      begin
          Log.Lines.Add('');
          {$IFNDEF Linux}
          SendMessage(Log.Handle, WM_KEYDOWN, VK_UP, 1);
          {$ENDIF}
      end;
      Start := Stop + 1;
      if Start > Length(Buffer) then
          Break;
      if Buffer[Start] = LF then
        Start := Start + 1;
      Stop := Start;
      while (Buffer[Stop] <> CR) and (Stop <= Length(Buffer)) do
          Stop := Stop + 1;
  end;
end;

De alli en adelante ya podré usar desde la aplicación las configuraciones que requiero ...


Saludos !! ..

ElKurgan 03-05-2018 08:08:11

Gracias por compartir la solución

Saludos

Matias_ 03-05-2018 21:02:31

Cita:

Empezado por koalasoft (Mensaje 525939)
Estimados, he decidido aumentar mas mi sistema en cuanto a procesos, para esto manualmente me conecto en una terminal via Telnet para ejecutar unos comando para dar de alta a equipos, en la aplicación que hice, genero los códigos necesarios para que cuando me conecte via telnet a ese equipo solo copie de la aplicación esos códigos y los pegue en la terminal de telnet. Pero dije, bueno por que no hacerlo desde la aplicación mejor .. y me puse a investigar ... estoy en pruebas ...

Los enlaces que pusieron muy bueno y en eso me base !! .

Puedo con ese ejemplo conectarme perfectamente .. pero todo lo hago manual nuevamente pues seria una terminal propia... lo que busco es que una vez que me conecte a la terminal via telnet pueda enviar comandos a ese equipo via telnet ...

Al conectarme por ese emplo me pide en el servidor donde me conecto la clave y contraseña ... puse 2 Edit1 (el usuario) y Edit2 (contraseña) ... o que ahora intento es tratar de que esos datos sean enviados vía telnet desde la aplicación para poder estar logeado..

Para conectarme tengo esto ..

Código PHP:

procedure TForm1.Button1Click(SenderTObject);
begin
  Telnet
.Host := IPServidor.Text;
  
Telnet.Port := StrToIntPuerto.Text );
  
Telnet.Connect;
  
Log.SetFocus;
end

En el evento OnConnect:

Código PHP:

procedure TForm1.TelnetConnect(SenderTObject);
begin
Log
.Lines.Add'Conectando con ' Telnet.Host '.' );
Log.Lines.Add'' );
Telnet.WriteLn(Trim(Edit1.Text)+#13);
Telnet.WriteLn(Trim(Edit2.Text)+#13);
end

y Aqui es donde envío los datos hacia la terminal ... pero veo que cuando lo hago de esta forma me toma solo el edit2 (clave) y deberia poner primero el usuario (edit) y después la contraseña ..

Alguna idea de que puede ser o que otra solución podria darse ? ..

Uso Delphi7 (si todavía)...

Buenas tardes, se ve muy interesante lo que tratas de hacer, aunque no mencionas que componentes estas usando para usar Telnet dentro de tu aplicacion, te podria mencionar que Telnet no es mas que una aplicacion Socket (ServerSocket-ClientSocket) por terminal que se conecta usando el puerto 23 por defecto; eso implica que podriamos tranquilamente implementarnos un Cliente Socket y conectarnos al servidor Telnet atravez del puerto 23 y hacerles consultas(mandandole comandos), en Delphi tengo entendido que se usan los componentes Indy para aplicaciones Sockets, por lo que veo sería el componente TIdTCPClient, aunque personamente solo he hecho clientes para Telnet en java usando la clase "Socket", eso no implica que no se pueda hacer algo similar en Delphi, supongo que si.;) Saludos...


La franja horaria es GMT +2. Ahora son las 19:52:39.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi