我需要使用Python通过SSH连接其他服务器,执行少量命令并将每个命令的结果分配给不同的变量.
最简单的方法是什么?
我已经尝试过SSHController,但我认为,我已经搞砸了一些提示,脚本正在无休止地等待它.
我会非常感激任何例子.
Jim*_*nis 13
在Python中有许多方法可以使用SSH.一般方法是:
ssh使用subprocess.Popen()或类似方法调用本地二进制文件(仅适用于以批处理方式收集结果)ssh使用pexpect或类似的pty(psuedo -TTY)进程控制机制调用和控制本地二进制文件(以自动方式生成并与终端会话中的进程交互)SSHController是这些广泛类别中的第二个.我自己简陋的工具,classh是第一类.
您的问题表明,通过探索Paramiko可能是最好的服务,因为听起来您希望根据远程流程执行的结果设置本地变量状态.我猜你不希望任何机会将任何类型的本地终端输出或错误消息与远程命令的结果混淆.
换句话说,听起来您希望使用SSH作为API而不是ssh命令实用程序.这是一个重要的区别.
该ssh命令试图像UNIX(和类似的MS Windows等)环境一样透明. ssh打开与远程系统的连接,并创建远程作业执行通信的多个通道.所以本地ssh stdout将来自远程命令' stdout,本地ssh stderr将是远程stderr和任何ssh命令自己的错误消息(以及其他输出,例如你在添加 - 时看到的调试信息)的混合物.v, - ssh调用的任何选项).同样,ssh命令的退出状态通常会反映远程shell的退出状态.但是它也可能是本地ssh进程自己的退出代码来自本地错误---根据我的经验,这似乎总是值255.我知道你无法区分远程命令的退出值255 vs来自本地进程的"异常终止"(异常处理结束) - 我怀疑没有任何便携,标准的方法可以这样做.
我的观点是,使用ssh代码中的命令必然会阻止您将输出与本地进程分开(ssh二进制本身,也许,取决于您执行它的方式,本地shell为此)和那些它来自远程进程(也许是运行预期远程进程的shell). ssh不是API.
另一方面,如果您使用类似Paramiko的东西,那么您可以通过SSH协议建立会话,您可以使用它,并重新使用它来执行命令,传输文件,执行一些其他文件系统功能以及创建隧道.
在这种情况下,您将创建一个SSHClient实例,并.exec_command()为要在远程主机上执行的每个命令调用其方法.这在概念上类似于进行本地函数调用...如果由于任何原因无法执行命令,它将引发异常......并且您从其stdout或stderr获得的任何结果都不能与来自任何中介的可能输出混淆进程(例如ssh二进制...在这种情况下根本没有执行).
这就是我推荐这种方法的原因.听起来你想要在每个远程目标上执行几个单独的命令,以避免在一次调用该ssh实用程序时运行它们所带来的可能的复杂性,并且没有多次调用的复杂性和性能开销ssh.如果您可以建立会话并将其用作API,则听起来您的代码将更简单,更健壮.
| 归档时间: |
|
| 查看次数: |
4444 次 |
| 最近记录: |