我正在尝试使用fabric自动化我的许多hive任务并捕获输出。配置单元作业在服务器上运行(通过代理访问),我想将这些配置单元作业的输出保存到本地计算机上的文件中。目前我的方法是使用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)。中士似乎满足(1)和(2)。
2条答案
按热度按时间rqmkfv5c1#
我不知道为什么你会得到一个登录横幅,但这可能有一些解释如何抑制它:https://serverfault.com/questions/66986/suppressing-ssh-banner-from-openssh-client/67006 你也可以使用
tail
以及head
按摩你的输出,当然,你可以随时操纵的结果stdout
在记忆里。所以我会这样做虽然我不是HiveMaven,但也可以在
.hiverc
可以更改输出格式的文件。nxagd54h2#
在用织物做了更多的实验之后,我可以非常接近地模仿
ssh myserver "hive -e 'show tables;'" > myserver_results.txt
. 以下是我尝试过的几种方法:run("hive -e 'show tables;' 2>/dev/null")
:这将把配置单元的stderr消息重定向到null,并且fabric返回的最终输出将不包括它。这并不完全有效,因为它还会抑制配置单元的进度消息—对于长时间作业,您永远无法确定作业是否正确运行或已暂停。套
env.combine_stderr = False
以及env.always_use_pty = False
以及run
一切正常。从文档中可以看出,这将关闭伪终端,使其难以交互,但在运行配置单元作业时,这似乎不是什么大事。此外,这两个选项都允许使用不同的stdout和stderr。但是,这仍然无法在配置单元启动之前从服务器中删除欢迎消息。output = run("hive -e 'show tables;' > temp_file.txt")
. 通过管道将输出传输到服务器上的一个文件,甚至不尝试处理从fabric返回的流输出。此文件可以写入服务器的/tmp
并且可以复制到本地机器上。