Crea tu propio cliente Telnet en C#

   Por necesidades de un nuevo proyecto, me he visto involucrado en la necesidad de establecer una conexion telnet, por lo que ya que nos ponemos a invetigar lo hacemos desde un Pocket PC, aunque el codigo que presento es independiente del dispositivo, incluso Mono.

  Despues de revisar varias librerias tipo dotnettelnet, me decante por Minimalistic Telnet, basicamente por que se adaptaba mas a mis necesidades y se ve mucho mas claro lo que pretendemos hacer a nivel de aprendizaje.

  Receta facil, facil, facil, utilizando dos simples funciones podremos trabajar contra nuestro servidor

  Primero agregamos a nuestro proyecto el fichero Minimalistic Telnet, y creamos el par de funciones, la primera es meramente para establecer la conexion, siendo los pasos necesarios conectar, y autenticarse ( txtDebug es un componente TextBox para poder ver los resultados ):

private void ConectToServer (string ip, string login, string password, int port, int timeout)
{

try
{

txtDebug.Text += «Conectando con « + ip + «:» + port + «… «;

//Conectar al servidor telnet
tc = new TelnetConnection(ip, port);

//Nos logueamos en el servidor
txtDebug.Text + = tc.Login(login, password, timeout);

// Comprobamos el simbolo del prompt para asegurarnos logueo, «$» , «#» o «>», cada servidor nos pondra el que el desee
string prompt = s.TrimEnd();
txtDebug.Text += s;
prompt = s.Substring(prompt.Length – 1, 1);

if (prompt != «$» && prompt != «>» && prompt != «#»)

//Podremos lanzar excepcion new Exception(«Connection failed») o bien mostrarlo por pantalla;
txtDebug.Text += «Connection failed»;

if (tc.IsConnected)
{
txtDebug.Text = «Conectado !!»;
}

}

catch (Exception ex)
{
      txtDebug.Text += «Error de conexion: « + ex.Message;
}

}

 

   Una vez conectados, ya podremos enviar directamente los comandos a ejecutar con otra sencilla funcion:

private string SendTelnetData(string prompt)
{

// Si esta conectado …
if (tc.IsConnected)
{

// enviamos el comando
tc.WriteLine(prompt);
prompt += tc.Read();

}

else
{
          lblStatus.Text = «Desconectado»;
}

return prompt;

}

Con las llamadas a estas dos funciones tenemos todo solucionado, por ejemplo:

ConectToServer («192.168.1.1», «usuario», «contraseña», 23, 100);
SendTelnetData(«comando1»);
SendTelnetData(«comando2»);

No olvidemos que para desconectar solo nos seria necesario enviar la instruccion: 

SendTelnetData(«exit»);

Quien se anima a hacer la version en SSH??

 

21 comentarios sobre “Crea tu propio cliente Telnet en C#”

  1. Gracias por el programa,ya lo ejecuté pero no corre,se conecta pero luego sale que el servidor no le asigna login. ¿Qué pasa, qué estoy haciendo mal?. ¿En dónde se le agrega el fichero Minimalistic Telnet?. Por favor, ayúdame,este proyecto tengo que presentar mañana,gracias.

  2. Si tienes problema en el login probablemente sea por el timeout, aunque segun este post esta a 100 ConectToServer («192.168.1.1», «usuario», «contraseña», 23, 100); te recomiendo que para hacer las pruebas lo subas (sin miedo) si lo tienes que poner a 1000 no te asuste.

    Respecto a donde agregar el Minimalist telnet, hazlo en el directorio donde tengas las clases de tu proyecto.

    Un saludo,
    Thempra

  3. Hola que tal, ya implemente el Telnet Minimalist, sin embargo al probar las funciones que estan en la parte superior, me dan los siguientes errores:
    1. «Invalid Expression Term ‘=’
    2. «; expected»

    en la linea:
    txtDebug.Text += tc.Login(login, password, timeout);

    Por lo que infiero que estoy haciendo algo mal al agregar la clase telnetminimalist, pero no hallo que exactamente, apreciaria mucho la ayuda y por cierto gracias por la colaboración Thempra.

  4. Buenas,
    el programa me corre pero no consigo que el login funciona. Parece como que no se manda correctamente el retorno de carro despues de introducir el usuario y por eso salta la excepcion «No password prompt».
    Se os ocurre algo para poder arreglarlo?
    Saludos

  5. Prueba a revisar a ver si el problema lo tienes en el simbolo del prompt, cuando haces login, depende del server de telnet

    Revisa el codigo del Minimalistic para ver si realmente tienes el tuyo, en la funcion:

    public string Login(string Username, string Password, int LoginTimeOutMs)
    {
    int oldTimeOutMs = TimeOutMs;
    TimeOutMs = LoginTimeOutMs;
    string s = Read();
    if (!s.TrimEnd().EndsWith(«:»))
    throw new Exception(«Failed to connect : no login prompt»);
    WriteLine(Username);

    s += Read();
    if (!s.TrimEnd().EndsWith(«:»))
    throw new Exception(«Failed to connect : no password prompt»);
    WriteLine(Password);

    s += Read();
    TimeOutMs = oldTimeOutMs;
    return s;
    }

    Fijate que simplemente lo que hace es identificar que le llegan los «:»

  6. Muy bueno el Artículo. Lo he probado, me conecta al servidor telnet (router), pero cuando le mando comandos con el método SendTelnetData, no me envía los saltos de línia o «Enters». ¿Cómo puedo hacerlo?

    Gracias y saludos!!! kalixe985@gmail.com

  7. Muy bueno el Artículo. Lo he probado, me conecta al servidor telnet (router), pero cuando le mando comandos con el método SendTelnetData, no me envía los saltos de línia o «Enters» para que se ejecute la instrucción que acabo de mandar. ¿Cómo puedo hacerlo?

    Gracias y saludos!!! kalixe985@gmail.com

  8. Esta excelente – me funciono OK a la primera ejecucion, lo probe para conectarme a un unix version AIX,

    estaria bueno desarrollar algo asi para SSH

    septiembre-2008

    Saludos!

  9. Saludos Javier, yo tengo que conectarme con AIX, pero el servidor de AIX – despues de loguearte te manda a un menu, bueno esto ya es por la configuracion interna, el punto es que el prom que te manda es un espacio en blanco, yo probe con Minimalistic Telnet, pero como el prom te manda un espacio en blaco me manda k no se pudo conectar, ya intente modificando la instruccion
    if (prompt != «$» && prompt != «>» && prompt != «#»)

    pero nada, haber si tu me puedes ayudar

  10. Vas por buen camino, simplemente pon un breakpoint en la linea que dices y recoge los datos del prompt, cambialos en el codigo por lo que has recibido y listo.

  11. Oye sera que puedes colocar el codigo completo? Ej, tengo problemas a colocar el codigo que publicaste, son problemas de declacion de variables, por ej la variable ‘s’ cuando la usas en:

    string prompt = s.TrimEnd();

    Gracias

  12. Buenos dias,

    Es la primera vez que me pego con c# me podrias decir donde tengo que crear las funciones?? me esta dando errores no se si es por que no agrego bien el fichero o por que puede ser,
    Muchas gracas de antemano

  13. Hola, la verdad soy nuevo en .Net, estoy probando tu aplicación pero tengo un problema cuando el indica que esta conectando con la dirección ip …:puerto, arroja un error indicando Error de conexión: Referencia a objeto no establecida como instancia de un objeto.
    Me podrías ayudar por favor.
    Cualquier cosa me escribes al correo alexander15950@gmail.com

Responder a thempra Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *