命令行代理的最佳方法?

2024-05-15 22:24:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用Python编写一个简单的命令行代理,它位于Telnet/SSH连接和本地串行接口之间。应用程序应该简单地在这两者之间桥接I/O,但是过滤掉某些不允许的字符串(由正则表达式匹配)。(这适用于路由器/交换机实验室,在该实验室中,用户可以远程串行访问这些设备。)

基本上,客户机与守护进程建立了Telnet或SSH连接。守护进程将客户端的输入传递出去(例如)/dev/ttyS0,并将来自ttyS0的输入传递回客户端。但是,我希望能够将来自客户端的某些字符串列入黑名单。例如,不应允许使用“delete foo”命令。在

我不知道怎样才能最好地解决这个问题。通信必须是异步的;我不能简单地等待回车来允许缓冲区从串行接口输出。根据流匹配正则表达式也很棘手,因为必须拦截以下所有内容:

delete foo(enter)
del foo(enter)
el foo(ctrl+a)d(enter)
dl(left)e(right) foo(enter)

……等等。唯一可靠的分隔符是CR/LF。在

我希望有人能给我指出正确的方向。我一直在研究Python模块,但到目前为止还没有找到任何东西。在


Tags: 字符串命令行应用程序客户端代理foo进程delete
3条回答

在考虑了一段时间后,似乎没有任何实用、可靠的方法来过滤客户端输入。我将从另一个角度来尝试:如果我能识别来自串行设备的警告消息中的持久模式(例如确认提示),我就可以可靠地中止。无论如何谢谢你的意见!在

Python不是我的主要语言,所以我将把这部分的答案留给其他人。不过,我做了很多安全方面的工作,我强烈建议采用“白名单”方式,而不是“黑名单”方式。换句话说,选择一组安全命令,禁止所有其他命令。这比试图想出所有恶意的可能性并加以防范要容易得多。在

正如您展示的所有示例都以(enter)结尾,为什么是…:

Communication must be asynchronous; I can't simply wait for a carriage return to allow the buffer to be fed out the serial interface

如果您可以在“enter”之前收集传入的数据,并将“edit”请求(如示例中的ctrl-a、left、right)应用于所收集的数据,那么您将在内存中留下“completed command about be sent”(将要发送的已完成命令)在内存中进行匹配、拒绝或发送。在

如果必须逐字执行,则(未缓冲)输入上的.read(1)将允许您这样做,但审查可能会变得更麻烦;同样,您可以在内存中保存到目前为止已发送的已编辑命令的映像(即使在发送它们的同时应用编辑请求),但是当“enter”到达时,如果您的审查结果显示这样的命令是不允许的——您可以向设备发送多个“delete”来擦除所述命令吗?或者有一个单独的“抛出完整行”编辑请求?在

如果你必须在收到的时候发送每个字符(在决定点之前不允许累积字符),并且没有办法删除/删除已经发送的字符,那么这个任务看起来是不可能的(尽管我根本不理解“不能等待回车”的条件,所以也许还有希望)。在

相关问题 更多 >