命令行代理的最佳方法?

时间:2009-09-26 23:03:33

标签: python regex command-line

我想在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模块,但到目前为止还没有提出任何建议。

4 个答案:

答案 0 :(得分:6)

Python不是我的主要语言,所以我会将这部分答案留给其他人。不过,我做了很多安全工作,我会敦促采用“白名单”方法,而不是“黑名单”方法。换句话说,选择一组安全命令并禁止所有其他命令。这比试图考虑所有恶意可能性并防范所有这些可能性要容易得多。

答案 1 :(得分:0)

正如您显示的所有示例都以(enter)结束,为什么......

  

通讯必须是异步的;一世   不能简单地等待马车   返回以允许缓冲区被馈送   出串行接口

如果您可以收集传入的数据,直到“输入”,并将“编辑”请求(例如您的示例中的ctrl-a,left,right)应用于您正在收集的数据,那么您就离开了在内存中可以匹配,拒绝或发送“已完成的命令”。

如果必须逐个字符地进行,那么(无缓冲)输入上的.read(1)将允许您进行,但审核可能会出现问题;再次,您可以保留到目前为止已编辑的命令的内存中图像(即使在发送时也应用编辑请求),但是当“输入”到达并且您的审查显示命令时会发生什么不能允许这样组成 - 你可以吗?发送一些“删除”s到设备擦除所述命令?或者是否只有一个“折腾整行”编辑请求?

如果你必须在收到它时发送每个字符(不允许累积它们直到决定点)并且无法删除/删除已经发送的字符,那么任务似乎是不可能的(虽然我不明白“不能等待进入”状态,所以也许有希望)。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

Fabric正在做类似的事情。

对于SSH api,您应该检查paramiko