使用python通过ssh捕获配置单元输出

使用python通过ssh捕获配置单元输出,python,ssh,hive,fabric,Python,Ssh,Hive,Fabric,我正在尝试使用fabric自动化我的许多蜂巢工作,并捕获输出。配置单元作业在服务器上运行(通过代理访问),我想将这些配置单元作业的输出保存到本地计算机上的文件中。目前我的方法是使用shell脚本通过SSH调用配置单元,并将输出重定向到文本文件。下面是一个例子: ssh myserver "hive -e 'show tables;'" > myserver_results.txt 我正在尝试使用python和fabric重新创建类似的内容: from fabric.api import

我正在尝试使用fabric自动化我的许多蜂巢工作,并捕获输出。配置单元作业在服务器上运行(通过代理访问),我想将这些配置单元作业的输出保存到本地计算机上的文件中。目前我的方法是使用shell脚本通过SSH调用配置单元,并将输出重定向到文本文件。下面是一个例子:

ssh myserver "hive -e 'show tables;'" > myserver_results.txt
我正在尝试使用python和fabric重新创建类似的内容:

from fabric.api import run, env

env.gateway = 'my_proxy'
env.hosts = ['hive_server']
output = run("hive -e 'show tables;'")
print(output)
我的问题是,使用shell脚本和使用fabric的输出不相等。shell脚本的输出如下所示:

[HIVE OUTPUT]
print(output)
print(output.stdout)
在织物中的结果将如下所示:

[WELCOME MESSAGE FOR THIS SERVER]
[HIVE START CONSOLE OUTPUT]
[HIVE OUTPUT]
[Time taken: 0.2 seconds, Fetched: 520 row(s)]
有没有一种简单的方法可以使用python和fabric重现shell脚本的输出

编辑: 我想编辑我的原始问题并扩大范围。经过更多的实验后,我认为Fabric将无法以我想要的方式轻松捕获输出。所以我提出了一个问题,有没有一种方法可以使用python通过SSH运行配置单元脚本并捕获配置单元输出

以下是要求摘要:

  • 执行以下操作时,输出必须与文件内容匹配:
    ssh myserver“hive-e”show tables;“>myserver_results.txt

  • 配置单元消息/进度的流式输出,就像在shell中运行上述命令一样

  • 使用SSH和代理服务器轻松安装,无需依赖于安装SSH配置

  • 在我的实验中,我尝试使用以下python库:paramiko、fabric、plumbum、sarge


    我认为织物是最接近的,并且满足(2)、(3)。Sarge似乎满足(1)和(2)。

    我不知道你为什么会收到登录横幅,但这可能有一些关于如何抑制它的解释:你也可以使用
    尾部
    头部
    来按摩你的输出,当然,你也可以在内存中操作
    标准输出的结果。所以我会这样做

    output = run(
        "hive -e 'show tables;' "
        "| head -n -1 "
        "| tail -n -3")
    # where 3 is the number of lines you want to skip at the beginning
    

    虽然我不是hive专家,但是您也可以在
    .hiverc
    文件中设置一些设置,这些设置可以更改输出的格式。

    在对Fabric进行了更多的实验之后,我可以非常接近于模仿myserver“hive-e”show tables;“>myserver_results.txt
    的输出。以下是我尝试过的几种方法:

  • run(“hive-e”show tables;'2>/dev/null”)
    :这将把hive的stderr消息重定向到null,fabric返回的最终输出将不包括它。这并不完全有效,因为它还会抑制配置单元的进度消息——对于长作业,您永远无法确定作业是否正确运行或已暂停

  • env.combine\u stderr=False
    env.always\u使用
    正常运行。从文档中可以看出,这将关闭伪终端,使其难以交互,但在运行配置单元作业时,这似乎没什么大不了的。此外,这两个选项都允许使用不同的stdout和stderr。然而,在配置单元启动之前,这仍然不能消除来自服务器的欢迎消息

  • output=run(“hive-e”show tables;'>temp_file.txt”)
    。通过管道将输出传输到服务器上的一个文件,甚至不尝试处理从fabric返回的流式输出。此文件可以写入服务器的
    /tmp
    ,并可以复制到本地计算机


  • 我也很困惑,当我通过SSH运行命令时,我在终端中看到服务器欢迎消息,但它没有通过管道传输到文本文件。不幸的是,这似乎不起作用,头/尾限制了配置单元输出,但服务器消息和配置单元开始/结束消息仍然显示