使用Python服务器(TCP套接字)和少量脚本创建简单的命令行接口(CLI)

0 投票
2 回答
896 浏览
提问于 2025-04-15 22:10

我有一台Linux电脑,我想通过telnet连接到它(使用77557端口),并运行一些需要的命令,而不需要访问整个Linux系统。所以,我在这个端口上有一个服务器在监听,并且可以把输入的命令显示在屏幕上。(目前是这样)

Telnet 192.168.1.100 77557
正在尝试连接192.168.1.100...
已连接到192.168.1.100。
退出字符是'^]'。

hello<br />

You typed: "hello"<br />

现在:

我想创建很多命令,每个命令都需要一些参数,并且有错误代码。有没有人做过类似的事情?如果服务器在初始化时能遍历每个目录,执行init.py文件,然后每个命令的init.py文件又调用一个主模板库的API(比如RegisterMe()),并把自己注册到服务器作为函数回调,那就太好了。这就是我在C/C++中会做的方式。

但我想用最符合Python风格的方法来实现这个。

/cmd/
/cmd/myreboot/
/cmd/myreboot/ini.py(注意下划线由于某种原因没有显示)
/cmd/mylist/
/cmd/mylist/init.py
...等等

输入:/cmd/myreboot/__ini__.py:
from myMainCommand import RegisterMe
RegisterMe(name="reboot",args=Arglist, usage="用这个来重启系统", desc="blabla")

所以,重复这个过程就会创建一个命令列表,当你在telnet会话中输入命令时,服务器会遍历这个列表,匹配命令,并把参数传递给那个命令,命令就会执行,并把成功或失败的信息打印到标准输出。

谢谢

2 个回答

0

Twisted的网络服务器做的事情有点像你想做的。它的基本方法是让一个可以加载的Python文件在加载的模块的全局命名空间中定义一个特定名称的对象。当服务器加载这个模块时,它会检查这个对象,确保它是正确类型的(这样就有了需要的接口),然后用它来处理请求的URL。在你的情况下,采用类似的方法可能也会很好用。

当看到一个命令名称时,可以动态地导入这个模块(可以查看内置的导入函数的文档,了解怎么做),然后寻找一个名为“command”的实例,接着用它来解析你的参数列表,进行处理,并返回结果代码。

其实在启动时不太需要预处理目录,当然如果你更喜欢在启动时处理,也可以这样做,而不是动态加载。

0

我会用 cmd2RPyC 这两个模块来构建这个应用。

撰写回答