我有一个工作的SSH Shell 服务器,我正在尝试创建一个类似于“ping”的命令(命令类),每隔几秒钟打印出一些数据。
shell 查找接收到的命令的可执行文件,使用给定的 args 实例化它们并运行它们:
def lineReceived(self, lines):
...
self.resume(None)
def run_cmd_stack(self):
cmd = self.cmd_stack.pop()
exe = self.get_executable(cmd)
exe.run()
def resume(self, ret):
"""Used by Executables to signal their completion
"""
self.RET = ret
if len(self.cmd_stack) > 0:
self.run_cmd_stack()
else:
self.showPrompt()
这段代码有效,但感觉不对:
class Executable(object):
def __init__(self, shell_protocol, cmd, reactor):
self.shell = shell_protocol
self.reactor = reactor
def end(self, ret):
self.shell.resume(ret)
class exe_wait(Executable):
name = 'wait'
def run(self):
i = int(self.args[0])
self.loopy(i)
return 0
def loopy(self, i):
d = defer.Deferred()
if i > 0:
self.shell.writeln("waiting...")
d.addCallback(self.loopy)
self.reactor.callLater(1, d.callback, i-1)
else:
d.addCallback(self.end)
d.callback(0)
- 我不特别喜欢将反应堆作为参数传递,只是为了我可以通过试验对其进行测试,但我不知道如何注入它只是为了测试。
- 我觉得让可执行文件调用 shell 的“resume()”方法很难看,我应该能够让 exe 在完成后“返回 0”。我遇到的问题是外壳程序只是运行并打印其提示而不是等待延迟。
在我尝试过的所有方法中,这是我唯一可以正常工作的方法,所以我非常感谢我能得到的任何建议。