2008-12-23 26 views
43

¿Hay una buena biblioteca telnet libre disponible para C# (no ASP .NET)? He encontrado algunos en Google, pero todos tienen un problema u otro (no es compatible con el inicio de sesión/contraseña, no es compatible con un modo con guión).C# Telnet Library

Supongo que MS todavía no ha incluido una biblioteca de telnet como parte de .NET v3.5 ya que no pude encontrarla si lo era. Aunque me encantaría estar equivocado.

+0

La respuesta aceptada es la solución final.No sé si todavía está disponible, pero en el momento en que se aceptó la respuesta, el código fuente de Telnet minimalista estaba disponible. –

Respuesta

40

El mejor C# Telnet Lib que he encontrado se llama Telnet minimalista. Muy fácil de entender, usar y modificar. Funciona muy bien para los enrutadores de Cisco que necesito configurar.

http://www.codeproject.com/KB/IP/MinimalisticTelnet.aspx

+1

Eso es exactamente lo que funcionó para mí por las mismas razones que describió. Me alegro de no estar solo a mi gusto. :) –

+0

telnet minimalista funcionó perfectamente para mí y para nuestro equipo de LAN. Terminé modificándolo para leer comandos de un archivo de texto para que nuestro equipo de LAN pudiera implementarlo fácilmente. –

+0

Empecé a usarlo también. Gran hallazgo – JCCyC

1

Dudo mucho que una biblioteca telnet alguna vez forme parte de .Net BCL, aunque usted tiene soporte de socket casi completo así que no sería demasiado difícil emular un cliente telnet, Telnet en su implementación general es un legado y La tecnología agonizante que existe en general se encuentra detrás de una nueva fachada moderna y agradable. En cuanto a las variantes de Unix/Linux, descubrirá que su SSH y telnet habilitante generalmente se consideran una mala práctica.

se puede consultar: http://granados.sourceforge.net/ - Biblioteca SSH para .Net http://www.tamirgal.com/home/dev.aspx?Item=SharpSsh

No obstante, deberá poner en marcha su propio envoltorio para manejar eventos para la alimentación en la entrada de una manera guión.

+2

El problema es que estoy tratando de hacer telnet en un dispositivo remoto que solo tiene Telnet habilitado. No estoy tratando de configurar una máquina. SSH no es una opción. Telnet es la única opción. Puedo ejecutar el comando a mano o puedo usar un pequeño programa para hacerlo por mí. Gracias por los enlaces. –

+0

Seguramente se le puede haber ocurrido que este tipo no tiene nada que decir sobre el servidor que usa Telnet o SSH. Solo una pista. –

1

Terminé encontrando MinimalistTelnet y lo he adaptado a mis usos. Terminé necesitando poder modificar en gran medida el código debido al ** dispositivo único que estoy tratando de adjuntar.

** Único en este caso se puede interpretar válidamente como muerte cerebral.

6

Aquí está mi código que finalmente está trabajando

using System; 
using System.IO; 
using System.Net; 
using System.Net.Sockets; 
using System.Text.RegularExpressions; 
using System.Threading; 

class TelnetTest 
{ 

    static void Main(string[] args) 
    { 
     TelnetTest tt = new TelnetTest(); 

    tt.tcpClient = new TcpClient("myserver", 23); 
    tt.ns = tt.tcpClient.GetStream(); 

    tt.connectHost("admin", "admin"); 
    tt.sendCommand(); 

    tt.tcpClient.Close(); 
} 

public void connectHost(string user, string passwd) { 
    bool i = true; 
    while (i) 
    { 
     Console.WriteLine("Connecting....."); 
     Byte[] output = new Byte[1024]; 
     String responseoutput = String.Empty; 
     Byte[] cmd = System.Text.Encoding.ASCII.GetBytes("\n"); 
     ns.Write(cmd, 0, cmd.Length); 

     Thread.Sleep(1000); 
     Int32 bytes = ns.Read(output, 0, output.Length); 
     responseoutput = System.Text.Encoding.ASCII.GetString(output, 0, bytes); 
     Console.WriteLine("Responseoutput: " + responseoutput); 
     Regex objToMatch = new Regex("login:"); 
     if (objToMatch.IsMatch(responseoutput)) { 
      cmd = System.Text.Encoding.ASCII.GetBytes(user + "\r"); 
      ns.Write(cmd, 0, cmd.Length); 
     } 

     Thread.Sleep(1000); 
     bytes = ns.Read(output, 0, output.Length); 
     responseoutput = System.Text.Encoding.ASCII.GetString(output, 0, bytes); 
     Console.Write(responseoutput); 
     objToMatch = new Regex("Password"); 
     if (objToMatch.IsMatch(responseoutput)) 
     { 
      cmd = System.Text.Encoding.ASCII.GetBytes(passwd + "\r"); 
      ns.Write(cmd, 0, cmd.Length); 
     } 

     Thread.Sleep(1000); 
     bytes = ns.Read(output, 0, output.Length); 
     responseoutput = System.Text.Encoding.ASCII.GetString(output, 0, bytes); 
     Console.Write("Responseoutput: " + responseoutput); 

     objToMatch = new Regex("#"); 
     if (objToMatch.IsMatch(responseoutput)) 
     { 
      i = false; 
     } 

    } 

    Console.WriteLine("Just works"); 
} 
} 
+1

Ok. áspero y listo y funciona principalmente, pero sugeriría antes de .Read() que verifique si hay ns.DataAvailable porque no podría haber respuesta, y estaría bloqueando para siempre; También pegue .Read() dentro de un ciclo para seguir leyendo, ya que es posible que no haya leído todos los datos de una vez. – joedotnot

+0

¿Dónde está el campo 'tcpClient'? – SuB