我正在尝试在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。