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

问题描述:

我想通过在c#中的telnet连接到思科交换机。我想用c#发送cmd命令,当它要求输入密码时,我想用我的程序输入密码。但我的问题是,当它连接到telnet时,我无法发送密码。而当我使用StreamWriter时,它会引发异常。
这里是我的代码:发送密码作为命令通过Telnet在C#

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(); 
    } 
} 
+1

....引发了什么异常? – Amy

+0

你有没有考虑过使用'TcpClient'来简化一些事情? https://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient(v=vs.110).aspx – Kdawg

如果你使用像SSH.NET一个lib你得到所有这些问题,你解决了,没有必要再推倒重来!

你将需要谈论Telnet。 Telnet rfcs将为您提供一个理想的解决方案。 https://tools.ietf.org/html/rfc854

如果您想手动执行此操作,可以提供一些帮助。或者说明为什么使用telnet库可能是个好主意。

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

  • 您可能会忽略很多协议详细信息,但不是最初的选项协商。您可能最初想要处理原始NetworkStream,因为Telnet会话以“选项”协商开始。 telnet的选项协商快速搜索变成这样了:How to deal with the telnet negotiation

有使用上面的读/写两个问题:

  • 他们将默认使用UTF-8编码,所以进行Telnet选项协商数据(不是7位ASCII)可能会发生变异。
  • 无论如何,readline()可能会挂起,因为它会读取telnet选项,这是服务器发送的第一件东西,但是一直试图读取,直到第一行结束......这将永远不会到达,因为服务器正在等待它发送的选项的响应。即您需要完成telnet选项协商。