1

我们已经为我们的硬件设备实现了一个 python shell,它只包含嵌入式 linux 上的 python cmd 模块。我们(非 root)用户的 shell 设置为 /etc/passwd 和 /etc/shadow 中这个 python shell 的路径。下面的代码示例:

#!/usr/bin/env python

import cmd

class OurCmdProcessor(cmd.Cmd, object):

def __init__(self):
    cmd.Cmd.__init__(self)

    ...

def cmdloop(self, intro = None):
    """Command loop.
       Overrides cmd class cmdloop() method.
    """
    signal.signal(signal.SIGINT, self._sigint_handler)
    try:
        cmd.Cmd.cmdloop(self, intro = intro)
    except:
        print("{} v2 exception!".format(branding))
        #traceback.print_exc(file=sys.stdout)
        sys.stdout.flush()

        # This *exits* the cmd shell on exception
        self.do_EOF()

def do_help(self):
        print("Here is some help text!")

etc...

以前,我们的一个客户使用 SSH.NET 使用该库的 RunCommand 函数发出命令行命令,该函数设置标准 SSH 'exec' 请求以通过 SSH 连接,然后解析输出和返回值。(即请求频道、频道成功、发送命令等。)

现在,该调用不起作用,大概是因为我们已经从 /bin/sh 切换到了这个 python shell。起作用的是使用该库的 SSH Shell 对象通过将命令文本后跟换行符来发送命令,然后扫描输出。

我要问的是,是否有可能在那个 shell 中实现一些东西来处理这个库正在发出的标准 SSH 'exec' 命令,或者在发出 SSH shell 请求之后执行命令时接收到的部分 shell 输出已经包含退出值了吗?我们不想将退出值作为命令可打印输出的一部分。

我们在嵌入式 linux 设备上使用 dropbear SSH 服务器。

4

1 回答 1

1

要在此模式下工作,您的 Python 脚本应该能够解析其命令行参数,就像解析以交互方式提供给您的Cmd实例的参数一样。

那是:

./yourpython -c "some command"

应该与以下工作相同:

./yourpython <<EOF
some command
EOF

...并且应该有一个退出状态,以反映要执行的最后一个命令是否成功。


这相当于如何在远程主机上ssh hostname 'some command'运行。"${SHELL:-sh}" -c 'some command'

于 2017-07-26T17:56:41.687 回答