Python SSH:使用fabric.api替代paramiko

时间:2017-05-19 15:16:45

标签: python ssh scripting fabric

我试图想出一种方法来取代Paramiko作为我目前拥有的许多脚本的SSH客户端,到目前为止我想出了这个测试草案:

ssh_handler.py

import sys
from fabric.api import run
from fabric.api import task
from fabric.api import execute
from fabric.network import disconnect_all


def worker(command):
    run(command)


@task
def cmd(host, command):

    host_list = list()

    if isinstance(host, (str, unicode)):
        host_list.append(host)

    elif isinstance(host, list):
        host_list += host

    else:
        sys.exit(1)

    # run the command
    execute(worker(command), hosts=host_list)

    # disconnect
    disconnect_all()

    return

从其他脚本执行此操作时,请说:

testing.py

import ssh_handler


node_list = ["192.168.0.1", "192.168.0.2"]

for node in node_list:
    ssh_handler.cmd(node, "uptime")

结果:

./testing.py
No hosts found. Please specify (single) host string for connection: ^C

有人能指出我正确的方向吗?为什么 fabric.api.execute 在执行期间无法识别 hosts 参数?

答案:

我能够通过这样做来解决这个问题:

import sys
from fabric.api import run
from fabric.tasks import execute
from fabric.network import disconnect_all


class FabricHelper:
    def __init__(self):
        self.host_list = list()
        pass

    def set_hosts(self, host):

        if isinstance(host, (str, unicode)):
            self.host_list.append(host)
        elif isinstance(host, list):
            self.host_list += host
        else:
            sys.exit(1)
        return

    def cmd(self, command):
        execute(run, command=command, hosts=self.host_list)
        disconnect_all()
        return


if __name__ == "__main__":

    example = FabricHelper()
    example.set_hosts(["10.200.10.51", "10.200.10.52"])
    example.cmd("uptime")

1 个答案:

答案 0 :(得分:0)

我对您的代码感到有点困惑,execute通常用于执行任务。但是worker不是一项任务。工人只是一个班轮,呼叫呼叫运行。所以在我看来,worker可以被删除。

起初我想知道你正在使用的测试框架是什么,然后我意识到它只是另一个名为test的python文件!

最后,为什么不在env dictionary中设置主机,而不是所有这些精心设计的机制?