编写一个telnet客户端

9 投票
9 回答
19162 浏览
提问于 2025-04-15 20:51

你好,

我有一个设备,它提供了一个telnet接口,你可以用用户名和密码登录,然后控制设备的工作。

我需要写一个C程序,把telnet的部分隐藏起来,而是给用户提供一个控制设备的界面。

我该怎么做比较好呢?我试着写了一个简单的socket程序,但在登录提示那里就停住了。我猜是因为我没有遵循TCP协议。

有没有人尝试过这个?有没有开源的库可以用来实现这个?

谢谢

补充:最终我希望通过一个web api/webservice来提供这个功能。平台是Linux。

9 个回答

3

虽然telnet几乎就是一个和终端连接的套接字,但其实并不完全一样。我认为在连接建立后,会有一些控制字符被传送。如果你的设备发送了一些意外的控制数据,可能会让你的程序感到困惑。
如果你还没有这样做,可以去下载wireshark(或者tshark或tcpdump)来监控你的连接。Wireshark(以前叫ethereal)是跨平台的,对于一些简单的操作来说,使用起来相当容易。你可以用tcp.port == 23来过滤数据。

4

telnet的协议其实很简单……你只需要建立一个TCP连接,然后发送和接收ASCII数据。就这么简单。

所以你真正需要做的就是写一个程序,先通过TCP连接,然后从TCP套接字读取字符,并解析这些字符来更新图形界面(GUI),或者根据用户在图形界面上的操作,把字符写回套接字。

具体怎么实现,主要取决于你用什么软件来构建你的界面。在TCP这边,简单地用一个事件循环配合select()就足够了。

10

如果你可以使用Python的话,可以试试telnetlib这个库。

这里有一个代码示例

#!/usr/bin/env python
import getpass
import sys
import telnetlib

HOST = "localhost"
user = raw_input("Enter your remote account: ")
password = getpass.getpass()

tn = telnetlib.Telnet(HOST)

tn.read_until("login: ")
tn.write(user + "\n")
if password:
    tn.read_until("Password: ")
    tn.write(password + "\n")

tn.write("ls\n")
tn.write("exit\n")

print tn.read_all()

撰写回答