Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-04-2018
koalasoft koalasoft is offline
Miembro
 
Registrado: oct 2004
Ubicación: Tenosique Tabasco
Posts: 86
Poder: 20
koalasoft Va por buen camino
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)...
Responder Con Cita
  #2  
Antiguo 28-04-2018
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 16
orodriguezca Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 28-04-2018
koalasoft koalasoft is offline
Miembro
 
Registrado: oct 2004
Ubicación: Tenosique Tabasco
Posts: 86
Poder: 20
koalasoft Va por buen camino
Cita:
Empezado por orodriguezca Ver Mensaje
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..
Responder Con Cita
  #4  
Antiguo 28-04-2018
koalasoft koalasoft is offline
Miembro
 
Registrado: oct 2004
Ubicación: Tenosique Tabasco
Posts: 86
Poder: 20
koalasoft Va por buen camino
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 !! ..

Última edición por Casimiro Notevi fecha: 29-04-2018 a las 03:31:09.
Responder Con Cita
  #5  
Antiguo 03-05-2018
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.232
Poder: 20
ElKurgan Va camino a la fama
Thumbs up

Gracias por compartir la solución

Saludos
Responder Con Cita
  #6  
Antiguo 03-05-2018
Matias_ Matias_ is offline
Miembro
NULL
 
Registrado: abr 2018
Posts: 11
Poder: 0
Matias_ Va por buen camino
Cita:
Empezado por koalasoft Ver Mensaje
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...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
conexión mediante ado a access r1d2m3 Conexión con bases de datos 4 24-11-2009 19:54:28
Conexion mediante ODBC, OLE DB, ADO? tsomarp Conexión con bases de datos 1 25-02-2005 14:05:27
Conexion con Oracle mediante ADO PTW Oracle 0 21-02-2005 15:50:25
Conexion a Access Mediante una DLL Draco Conexión con bases de datos 0 29-04-2004 05:27:47
Conexion a DBF mediante DBE Celta777 Conexión con bases de datos 2 18-10-2003 20:59:52


La franja horaria es GMT +2. Ahora son las 10:33:19.


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
Copyright 1996-2007 Club Delphi