在 C# 中通过 Telnet 作为命令发送密码

send password as command via Telnet in C#

我想通过 c# 中的 telnet 连接到 cisco 交换机。我想用 c# 在 cmd 中发送命令,当它要求输入密码时,我想用我的程序输入它。但我的问题是当它连接到 telnet.And 时我无法发送密码,当我使用 StreamWriter 时它会抛出异常。
这是我的代码:

class Program
{
    static void Main(string[] args)
    {
        string data = "";  
        StreamReader reader = new StreamReader(@"C:\Windows\System32");  
        StreamWriter writer = new StreamWriter(@"C:\Windows\System32");  
        IPAddress address = IPAddress.Parse("172.16.0.110");  
        IPEndPoint ipe = new IPEndPoint(address, 23);  
        Socket telnetSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);  
        telnetSocket.Connect(ipe);  
        NetworkStream NsStream = new NetworkStream(telnetSocket, true);  
        if (telnetSocket.Connected)  
        {  
            NsStream = new NetworkStream(telnetSocket, true);  
            reader = new StreamReader(NsStream);  
        }  

        while (!reader.EndOfStream)  
        {  
            data = reader.ReadLine();  
            if (data.Contains("Password:"))  
            {  
                //I want to enter password in cmd here  
            }  
        }  
        reader.Close();  
        if (NsStream == null)  
            NsStream.Close();  
    }
}

如果您使用像 SSH.NET 这样的库,您就可以解决所有这些问题,而无需重新发明轮子!

您将需要使用 Telnet。 Telnet rfcs 会让你知道你正在处理什么。 https://www.rfc-editor.org/rfc/rfc854

如果您想手动执行此操作,一些可能会有所帮助的建议。或者说明为什么使用 telnet 库可能是个好主意。

  • TcpClient 会稍微减少你的工作量。至少它会为你创建 NetworkStream。

  • 您可能会忽略大部分协议细节,但不能忽略初始选项协商。您可能希望最初处理原始 NetworkStream,因为 telnet 会话以 'option' 协商开始。快速搜索 telnet option negotiation 会发现:How to deal with the telnet negotiation

使用上面的reader/writer有两个问题:

  • 他们将默认使用 UTF8 编码,因此 telnet 选项协商数据(不是 7 位 ASCII)可能会发生变异。
  • Readline() 可能无论如何都会挂起,因为它会读取 telnet 选项,这是服务器发送的第一件事,但随后一直尝试读取直到行的第一个结尾......永远不会到达因为服务器正在等待对其发送的选项的响应。即您需要完成 telnet 选项协商。