我们已经为我们的硬件设备实现了一个 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 服务器。