在 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 选项协商。
我想通过 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 选项协商。