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

Capturing hive output over ssh using python

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

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 无法以我想要的方式轻松捕获输出。所以我提出问题,有没有办法通过 SSH 使用 python 到 运行 配置单元脚本并捕获配置单元输出?

这里是要求的总结:

  1. 当我这样做时,输出必须与文件的内容匹配:ssh myserver "hive -e 'show tables;'" > myserver_results.txt

  2. 配置单元的流输出 messages/progress 就像我 运行 shell

  3. 中的上述命令一样
  4. 轻松设置以使用 SSH 和代理服务器,而不必依赖于设置 ssh 配置。

根据我的实验,我尝试使用以下 python 库:paramiko、fabric、plumbum、sarge。

我觉得Fabric最接近,满足(2)、(3)。 Sarge 似乎满足 (1) 和 (2)。

我不确定您为什么会收到登录横幅,但这可能对如何抑制它有一些解释:https://serverfault.com/questions/66986/suppressing-ssh-banner-from-openssh-client/67006您也可以使用 tailhead 来处理您的输出,当然,您始终可以在内存中操作 stdout 的结果。所以我会做这样的事情

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 进行更多试验后,我可以非常接近地模仿 ssh myserver "hive -e 'show tables;'" > myserver_results.txt 的输出。以下是我尝试过的几种方法:

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

  2. 设置env.combine_stderr = Falseenv.always_use_pty = Falserun为正常。从文档来看,这将关闭伪终端,使其难以交互,但在 运行 中,蜂巢作业似乎没什么大不了的。此外,通过这两个选项,它允许不同的 stdout 和 stderr。然而,这仍然没有摆脱服务器在配置单元启动前的欢迎信息。

  3. output = run("hive -e 'show tables;' > temp_file.txt")。将输出通过管道传输到服务器上的文件,甚至不要尝试处理从 fabric 返回的流输出。这个文件可以写到服务器的/tmp,也可以复制到本地机器。