快速工具:一个极简的 Telnet 库






4.88/5 (78投票s)
使用 Telnet 协议从您的程序向服务器发送命令

引言
本文提供了一个极简的 Telnet 接口。这个类可能的应用包括:
- 一个 Telnet 控制台
- 在一些需要在服务器上执行的 UNIX 命令周围构建一个 Windows GUI
- 一个执行脚本的程序(脚本化的 telnet)
背景
不久前,我的一个客户遇到了一个问题:一个使用 UNIX 脚本 (HP-UX) 管理系统的人即将离开公司。此人不会被新员工取代,因此他的职能将由其他几个人来完成。
在评估教导其他人如何使用 UNIX 的成本时,我们进行了一些计算,并找到了一个更便宜的解决方案:我们构建了一个简单的 Windows 程序,其中包含每个使用的脚本的 GUI。
用户只需按下一些按钮,选择一些值,然后按下“启动”按钮。当用户按下启动按钮时,UNIX 命令会使用 GUI 中的参数构建,并使用 Telnet 发送到服务器。
因为我记得花费了不少时间来弄清楚 Telnet 协议的最小实现,所以我决定为 CodeProject 的用户做一个简单的重写。
使用代码
这个类实际上非常容易使用。请看一下示例代码
//create a new telnet connection to hostname "gobelijn" on port "23"
TelnetConnection tc = new TelnetConnection("gobelijn", 23);
//login with user "root",password "rootpassword", using a timeout of 100ms,
//and show server output
string s = tc.Login("root", "rootpassword",100);
Console.Write(s);
// server output should end with "$" or ">", otherwise the connection failed
string prompt = s.TrimEnd();
prompt = s.Substring(prompt.Length -1,1);
if (prompt != "$" && prompt != ">" )
throw new Exception("Connection failed");
prompt = "";
// while connected
while (tc.IsConnected && prompt.Trim() != "exit" )
{
// display server output
Console.Write(tc.Read());
// send client input to server
prompt = Console.ReadLine();
tc.WriteLine(prompt);
// display server output
Console.Write(tc.Read());
}
Console.WriteLine("***DISCONNECTED");
Console.ReadLine();
我想这是不言自明的,不是吗?创建 Telnet 连接,登录,将登录输出发送到屏幕,并在连接时将服务器输出发送到屏幕,从命令行读取命令,然后再次将服务器输出发送到屏幕。
如果命令是"exit"
,则需要完成循环。
输入也可以从脚本中管道输入,而不是从控制台读取输入:如果脚本名为telnetstuff.txt,则按如下方式执行脚本
MinimalisticTelnet < telnetstuff.txt > output.txt
结果将在文件output.txt中。目前,服务器名称、端口、用户名和密码都是硬编码的,但将其更改为命令行参数应该很容易。
它是如何工作的
TelnetConnection
解析从 TcpClient 接收的每个字节,如果字节序列是 Telnet 选项请求(DO
、DONT
、WILL
、WONT
),则客户端仅通过返回发送(DONT
、WONT
)来响应该选项不可用。
这些响应的唯一例外是命令SGA: suppress go ahead
,因为此命令允许异步流量。
关注点
TelnetConnection.Read
函数假定如果没有数据可用超过TimeOutMs
毫秒,则输出已完成。
登录的工作原理是在初始连接后解析服务器输出。它将在屏幕输出中查找冒号":"
,并在冒号后发送用户名和密码。
为了检查连接是否成功,我查看服务器输出是否以"$"
或">"
结尾。如果您的 Telnet 服务器有其他提示,请替换它。
投票 & 评论
我对上一篇文章的投票和评论激励我发表了一篇新文章,所以请继续投票和评论!!
历史
- 2007-06-06:第一个版本