使用paramiko将命令发送到具有交互元素的开放shell

时间:2013-03-01 01:48:56

标签: python ssh paramiko

我正在尝试在Oracle ZFS阵列上执行远程脚本。他们设计CLI的方式是你可以通过SSH向它发送一个javascript“脚本”。这个脚本应该在第一行中有“script”这个词,它将调用一个子shell,它在执行之前在它自己的行上等待一段时间

示例:

script
run('shares');
var projects = list();
dump(projects);
.

如果你这样使用它:

$ ssh array < above_script

以JSON可读格式输出一个很好的项目列表。

我想在python脚本中使用paramiko ssh,但到目前为止,我没有太多运气。成功连接并获取SSHClient实例后,我正在尝试这个:

try:
    get_projects = """run('shares');
                    var projects = list();
                    dump(projects);"""
    w, r, e = ssh.exec_command('script')

    for line in get_projects.split('\n'):
        w.write(line)
    w.write('.')
    pp.pprint(e.readlines())
    pp.pprint(r.readlines())

except paramiko.SSHException, e:
    logger.exception("Couldn't execute script on array %s: %s" % (array.name, e))

问题在于它永远不会回归,只是坐在那里。我甚至不能ctrl-c停止它,我必须ctrl-z并杀死它。

如果我删除尝试读取stderr,并且stdout返回但没有捕获任何内容,那么从套接字中读取似乎有一个问题:

INFO:paramiko.transport:Authentication (publickey) successful!
INFO:root:Not none
DEBUG:paramiko.transport:[chan 1] Max packet in: 34816 bytes
DEBUG:paramiko.transport:[chan 1] Max packet out: 32768 bytes
INFO:paramiko.transport:Secsh channel 1 opened.
DEBUG:paramiko.transport:[chan 1] Sesch channel 1 request ok
DEBUG:paramiko.transport:EOF in transport thread

任何见解都将不胜感激。


小更新(这看起来很难看): 使用ssh.invoke_shell()调用Channel允许我发送脚本,然后运行shell.recv(1024)返回下面的杂乱输出:

INFO:paramiko.transport:Authentication (publickey) successful!
>>> shell = ssh.invoke_shell()
DEBUG:paramiko.transport:[chan 1] Max packet in: 34816 bytes
DEBUG:paramiko.transport:[chan 1] Max packet out: 32768 bytes
INFO:paramiko.transport:Secsh channel 1 opened.
DEBUG:paramiko.transport:[chan 1] Sesch channel 1 request ok
DEBUG:paramiko.transport:[chan 1] Sesch channel 1 request ok
>>> get_projects = """script
...                             run('shares');
...                             var projects = list();
...                             dump(projects);
...                             .
...                             """
>>> get_projects
"script\n                            run('shares');\n                            var projects = list();\n                            dump(projects);\n                            .\n                            "
>>> shell.send(get_projects)
203
>>> shell.recv(1024)
'Last login: Fri Mar  1 02:26:58 2013 from 10.91.134.163\r\r\n\r\x1b[1mciczfsa:>\x1b[m\x0f \x1b[m\x0fscript\n\r\r("." to run)> \x1b[m\x0f                            run(\'shares\');\n\r\r("." to run)> \x1b[m\x0f                            var projects = list();\n\r\r("." to run)> \x1b[m\x0f                            dump(projects);\n\r\r("." to run)> \x1b[m\x0f                            .\n\r[\'Project1\', \'Project_PoolA_2\', \'RBR_PROJECT\', \'SAS_501\', \'TestProject\', \'default\', \'reptest\', \'testproj1\', \'testproj2\']\r\n\r\x1b[1mciczfsa:>\x1b[m\x0f \x1b[m\x0f                            '

这里不是TON的帮助,因为它显然没有结构化。理想情况下,我想将脚本发送到shell,并接收结构化响应,我可以将其解析为JSON。

0 个答案:

没有答案