python shell 的 SSH 和 exec 通道

SSH and exec channels with python shell

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

#!/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 连接,然后解析输出和 return 值。 (即请求通道、通道成功、发送命令等。)

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

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

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

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

即:

./yourpython -c "some command"

应该与以下工作方式相同:

./yourpython <<EOF
some command
EOF

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


这等同于 ssh hostname 'some command' 在远程主机上运行 "${SHELL:-sh}" -c 'some command' 的方式。