[英]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
不是任務。 工人只是一個班輪,是一個號召運行的電話。 因此在我看來,tat worker
可以刪除。
起初,我想知道您正在使用的測試框架是什么,然后我意識到這只是另一個名為test的python文件!
最后,為什么不只在env詞典中設置主機,而不是所有這些復雜的機制?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.