使用python通过ssh捕获配置单元输出
我正在尝试使用fabric自动化我的许多蜂巢工作,并捕获输出。配置单元作业在服务器上运行(通过代理访问),我想将这些配置单元作业的输出保存到本地计算机上的文件中。目前我的方法是使用shell脚本通过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
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
我认为织物是最接近的,并且满足(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运行命令时,我在终端中看到服务器欢迎消息,但它没有通过管道传输到文本文件。不幸的是,这似乎不起作用,头/尾限制了配置单元输出,但服务器消息和配置单元开始/结束消息仍然显示