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'
的方式。
我们已经为我们的硬件设备实现了 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'
的方式。