Ответ 1
Лучший С# Telnet Lib, который я нашел, называется Minimalistic Telnet. Очень легко понять, использовать и модифицировать. Он отлично работает для маршрутизаторов Cisco, которые мне нужно настроить.
Есть ли хорошая, бесплатная библиотека telnet, доступная для С# (не ASP.NET)? Я нашел несколько в google, но у всех есть одна проблема (не поддерживайте логин/пароль, не поддерживайте сценарий).
Я предполагаю, что MS по-прежнему не включил библиотеку telnet как часть .NET v3.5, поскольку я не мог ее найти, если бы это было. Я бы loooooove, чтобы быть неправ, хотя.
Лучший С# Telnet Lib, который я нашел, называется Minimalistic Telnet. Очень легко понять, использовать и модифицировать. Он отлично работает для маршрутизаторов Cisco, которые мне нужно настроить.
Вот мой код, который, наконец, работает
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");
}
}
Другой вариант с другой концепцией: http://www.klausbasan.de/misc/telnet/index.html
Здесь представлена библиотека и программа telnet, которая использует ее в качестве примера. Весь источник (включая источник библиотеки) находится в нижней части статьи.
В примере выполняется логин для маршрутизатора Cisco и загружается конфигурация
http://www.xpresslearn.com/networking/code/csharp-telnet-client
Я очень сомневаюсь, что библиотека telnet когда-либо будет частью .NET BCL, хотя у вас есть почти полная поддержка сокетов, поэтому было бы слишком сложно эмулировать клиента telnet, Telnet в своей общей реализации - это наследие и умирание технология, в которой, как правило, находится за красивым новым современным фасадом. Что касается вариантов Unix/Linux, вы обнаружите, что из его SSH и включения telnet обычно считается плохой практикой.
Вы можете проверить: http://granados.sourceforge.net/ - Библиотека SSH для .Net http://www.tamirgal.com/home/dev.aspx?Item=SharpSsh
Вам по-прежнему нужно будет создать собственную оболочку для обработки событий для ввода ввода в сценарии.
Я закончил поиск MinimalistTelnet и адаптировал его для моих целей. В итоге мне пришлось сильно изменить код из-за уникального ** устройства, к которому я пытаюсь подключиться.
** Уникальный в этом случае может быть корректно интерпретирован как "мертвый мозг".
В настоящее время я оцениваю две библиотеки .NET(v2.0) С# Telnet, которые могут представлять интерес:
Надеюсь, что это поможет.
С уважением, Энди.
Еще один, это более старый проект, но разделяет полный исходный код: http://telnetcsharp.codeplex.com/