我正在尝试使用结构自动化许多配置任务并捕获输出。配置单元作业在服务器上运行(可通过代理访问),我想将这些配置单元作业的输出保存到本地计算机上的文件中。当前,我的方法是使用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无法以我想要的方式轻松捕获输出。所以我提出一个问题,是否有一种方法可以使用python通过SSH运行配置单元脚本并捕获配置单元输出?
以下是要求摘要:
ssh myserver "hive -e 'show tables;'" > myserver_results.txt
根据我的实验,我尝试使用以下python库:paramiko,fabric,plumbum,sarge。
我认为Fabric是最接近的,可以满足(2),(3)。萨尔格似乎满足(1)和(2)。
最佳答案
我不确定为什么会出现登录标语,但这可能会对如何隐藏它产生一些解释:https://serverfault.com/questions/66986/suppressing-ssh-banner-from-openssh-client/67006您还可以使用tail
和head
来按摩输出,当然,您始终可以操纵内存中的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
文件中设置一些设置,这些设置可以更改输出格式。
关于python - 使用python通过ssh捕获配置单元输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40143648/