【问题标题】:Best approach to a command line proxy?命令行代理的最佳方法?
【发布时间】:2009-09-26 23:03:33
【问题描述】:

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

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

我不确定如何最好地解决这个问题。通信必须是异步的;我不能简单地等待回车以允许将缓冲区送出串行接口。将正则表达式与流匹配似乎也很棘手,因为必须拦截以下所有内容:

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

...等等。唯一的实体分隔符是 CR/LF。

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

【问题讨论】:

    标签: python regex command-line


    【解决方案1】:

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

    【讨论】:

    • 好点,我应该在问题中注意到这一点,但不幸的是,用户可以设置几乎无限数量的命令偏差。想象一下,当您只想阻止“rm”的变体时,尝试将所有可能的 Bash 命令列入白名单。
    • 有几乎无穷无尽的 bash 命令列表,这些命令不能删除文件,而是覆盖它。这可能与删除一样具有破坏性。听起来是个棘手的问题。
    【解决方案2】:

    您展示的所有示例都以(enter) 结尾,为什么...:

    通信必须是异步的;我 不能简单地等马车 返回以允许输入缓冲区 出串口

    如果您可以在“输入”之前收集传入数据,并将“编辑”请求(例如示例中的 ctrl-a、左、右)应用于您正在收集的数据,那么您就离开了在内存中“即将发送完成的命令”可以匹配和拒绝或继续发送。

    如果您必须逐个字符地进行,则(无缓冲)输入上的.read(1) 将允许您这样做,但审查可能会变得更加成问题;再次,您可以保留到目前为止已发送的已编辑命令的内存图像(即使在发送它们时应用编辑请求),但是当“输入”到达并且您的审查向您显示该命令时会发生什么不允许这样组成——你可以吗?向设备发送多个“删除”以擦除所述命令?或者是否有一个“抛出完整行”的编辑请求可以提供服务?

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

    【讨论】:

    • 我的意思是我不能缓冲整个事情直到 CRLF;它需要通过,才能使 tab-completion 之类的东西正常运行。
    • 好的,但是,您可以像我在传递连接之前所说的那样“取消”或“擦除”吗?这就是问题的症结所在。此外,如果串行设备非常复杂以至于您无法模拟它的命令,例如制表符补全,有可能不是通过仿真而是通过在将设备的响应字节传递回客户端时抓取设备的响应字节来构造行的当前状态——如果没有更多细节,很难说更多。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      Fabric 也在做类似的事情。

      对于 SSH api,您应该检查 paramiko

      【讨论】:

        猜你喜欢
        • 2015-12-06
        • 2013-04-30
        • 2020-08-03
        • 1970-01-01
        • 2010-09-28
        • 2010-09-26
        • 2018-10-22
        • 2015-03-09
        相关资源
        最近更新 更多