Python SSH:使用 fabric.api 作为 paramiko 的替代品
Python SSH: Using fabric.api as alternative to paramiko
我正在尝试想出一种方法来将 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")
我有点看不懂你的代码,execute
一般是用来执行任务的。但是 worker
不是任务。 Worker 只是一个调用 运行 的调用。所以我觉得tat worker
可以删除。
起初我想知道你使用的这个测试框架是什么,后来我意识到它只是另一个名为 test!python 的文件!
最后,为什么不直接在 env dictionary 中设置主机,而不是所有这些复杂的机制?
我正在尝试想出一种方法来将 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")
我有点看不懂你的代码,execute
一般是用来执行任务的。但是 worker
不是任务。 Worker 只是一个调用 运行 的调用。所以我觉得tat worker
可以删除。
起初我想知道你使用的这个测试框架是什么,后来我意识到它只是另一个名为 test!python 的文件!
最后,为什么不直接在 env dictionary 中设置主机,而不是所有这些复杂的机制?