gpt4 book ai didi

python - 在python中使用SSH

转载 作者:行者123 更新时间:2023-11-28 19:40:42 25 4
gpt4 key购买 nike

我需要使用Python通过SSH与其他服务器连接,执行少量命令并将每个命令的结果分配给不同的变量。
最简单的方法是什么?
我尝试了SSHController,但我认为,我已经用提示搞砸了,脚本正在无休止地等待着它。
我会很感激任何例子。

最佳答案

在Python中有多种使用SSH的方法。通用方法是:

  • 使用subprocess.Popen()或类似名称(仅适用于批量收集结果)调用本地ssh二进制文件
  • 使用pexpect或类似的pty(psuedo-TTY)流程控制机制(用于以自动方式在终端 session 中生成并与流程进行交互)来调用和控制本地ssh二进制文件
  • 使用Python模块/库,例如ParamikoTwisted conch,它实现SSH协议(protocol)(直接在本机Python中,或者通过提供对某些基础共享库... .so或DLL的绑定(bind))。

  • SSHController在这些大类中排第二。我自己的卑鄙工具 classh属于第一类。

    您的问题表明,探索 Paramiko可能会最好地为您服务,因为这听起来像您想根据远程进程执行的结果设置局部变量状态。我猜想您不希望将任何形式的本地终端输出或错误消息与远程命令的结果混为一谈。

    换句话说,听起来您想使用SSH作为API而不是 ssh作为命令实用程序。这是本质区别。
    ssh命令尝试在UNIX(和类似的MS Windows等)环境允许的范围内保持透明。 ssh打开与远程系统的连接,并创建许多通道,远程作业执行通过这些通道进行通信。因此,本地 ssh stdout将来自远程命令的stdout,本地 ssh stderr将是远程stderr与 ssh命令自身的错误消息(以及其他输出,例如您从中看到的调试信息)的混合将-v,--verbose选项添加到 ssh调用中)。同样, ssh命令的退出状态通常会反射(reflect)远程shell的退出状态。但是,它也可能是本地 ssh进程自身从本地错误中退出的代码---以我的经验,它似乎总是值255。我不知道您可以区分远程命令的退出值255与本地流程中的“异常结束”(异常流程结束)相比,我怀疑没有任何可移植的标准方法来执行此操作)。

    我的意思是,在代码中使用 ssh命令必然会阻止您将输出与本地进程分开( ssh二进制本身,并且可能取决于您的执行方式,因此是本地shell)以及那些来自远程进程(可能是运行预期的远程进程的 shell )发出的消息。 ssh不是API

    另一方面,如果使用Paramiko之类的东西,则可以通过SSH协议(protocol)建立 session ,并且可以使用 来执行命令,传输文件,执行其他一些文件系统功能以及创建隧道。

    在这种情况下,您将创建一个 SSHClient实例,并为要在远程主机上执行的每个命令调用其 .exec_command()方法。从概念上讲,这类似于进行局部函数调用...如果由于某种原因无法执行命令,它将引发异常...并且您从其stdout或stderr获得的任何结果都无法与任何中介的可能输出混淆进程(例如 ssh二进制...在这种情况下根本不执行)。

    这就是为什么我推荐这种方法的原因。听起来您好像想在每个远程目标上执行几个单独的命令,这样可以避免在对 ssh实用程序的一次调用中同时运行所有命令所带来的可能的复杂性,同时又避免了多次调用 ssh所带来的复杂性和性能开销。听起来,如果您可以建立 session 并将其用作API,那么您的代码将变得更加简单和强大。

    关于python - 在python中使用SSH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7622739/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com