我们已经为我们的硬件设备实现了一个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'命令,或者执行命令后接收到的shell输出的一部分。 SSH shell请求是否包含退出值?我们不希望将退出值包含在命令可打印输出中。
我们在嵌入式Linux设备上使用dropbear SSH服务器。
答案 0 :(得分:1)
要在此模式下工作,您的Python脚本应该能够解析其命令行参数,就像它以交互方式解析给您的Cmd
实例的参数一样。
那是:
./yourpython -c "some command"
应与以下内容完全相同:
./yourpython <<EOF
some command
EOF
...并且应该有一个退出状态,反映最后一个要执行的命令是否成功。
这相当于ssh hostname 'some command'
在远程主机上运行"${SHELL:-sh}" -c 'some command'
的方式。