from fabric.api import env
from fabric.api import run
class FabricSupport:
def __init__ (self):
pass
def run(self, host, command):
env.key_filename = 'C:/.ssh/dev.pub'
env.host_string = "%s:%s" % (host, 22)
run(command, timeout=5)
fab = FabricSupport()
def execute(host, txt):
stdout = ""
try:
stdout = fab.run(host, txt)
except Exception, e:
stdout = str(e)
return stdout
result = execute("23.23.23.23", "uname -a")
它只是输出以下内容并且无限期地保持这样。超时似乎没有效果。如果它更冗长,那将是很好的,所以我可以调查发生了什么。
[12.45.241.11:22] run:uname -a
答案 0 :(得分:2)
我不确定您的最终目标是使用此代码段。如果你试图通过在类中使用它来隔离修改env的效果,那就不会起作用了。它是一个模块级的全局结构,无论你在哪里修改它(通过像你在这里做的那样),它将适用于任何后续代码。我认为你可能真正想要的是:
from fabric.api import run, execute, task, settings
@task
def custom_runner(command):
"""Runs command with custom key_filename"""
with settings(warn_only=True, key_filename=r"C:\.ssh\dev.pub"):
result = run(command, timeout=5)
return result
result = execute(custom_runner, "uname -a", host="23.23.23.23")
请记住,“fab”命令行实用程序不能按原样使用它,因为一旦fab加载fabfile,它就会执行该代码(result = execute ...)。这将是严格的图书馆使用。
您可以使用roledef来执行此类主机组。结果对象将是一个字典,其中每个主机都是一个键,相应的值是任务的返回对象。您几乎从不想使用裸Exception子句,Fabric有自己的方法来防止异常导致程序终止。
答案 1 :(得分:1)
我今天遇到了与Ubuntu主机相同的问题。我的问题是活动的shell设置:
env.shell = /bin/sh -l -c
使用此shell,脚本不会干净地执行远程命令并挂起ssh连接。控件保留在ssh shell中,导致结构超时。
使用以下设置:
env.shell = "/bin/bash -c"
一般建议:根据主机操作系统检查shell和参数。
答案 2 :(得分:0)
这周,当我需要在远程计算机上运行长时间的工作时,遇到了同样的挂起错误。
我通过在fabric.api.env配置中指定'keepalive'选项解决了它。此配置将要求Fabric每隔几分钟发送一次keepalive消息。
http://docs.fabfile.org/en/1.14/usage/env.html#keepalive
我将值设置为30,并且在运行3小时的作业上都不会挂起。