使用 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 到 运行 配置单元脚本并捕获配置单元输出?
这里是要求的总结:
当我这样做时,输出必须与文件的内容匹配:ssh myserver "hive -e 'show tables;'" > myserver_results.txt
配置单元的流输出 messages/progress 就像我 运行 shell
中的上述命令一样
轻松设置以使用 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您也可以使用 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
文件中设置一些可以更改输出格式的设置。
在使用 Fabric 进行更多试验后,我可以非常接近地模仿 ssh myserver "hive -e 'show tables;'" > myserver_results.txt
的输出。以下是我尝试过的几种方法:
run("hive -e 'show tables;' 2>/dev/null")
:这会将 hive 的 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
,也可以复制到本地机器。
我正在尝试使用结构自动化我的许多配置单元作业并捕获输出。服务器上的配置单元作业 运行(通过代理访问),我想将这些配置单元作业的输出保存到本地计算机上的文件中。目前我的方法是使用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 到 运行 配置单元脚本并捕获配置单元输出?
这里是要求的总结:
当我这样做时,输出必须与文件的内容匹配:
ssh myserver "hive -e 'show tables;'" > myserver_results.txt
配置单元的流输出 messages/progress 就像我 运行 shell
中的上述命令一样
轻松设置以使用 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您也可以使用 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
文件中设置一些可以更改输出格式的设置。
在使用 Fabric 进行更多试验后,我可以非常接近地模仿 ssh myserver "hive -e 'show tables;'" > myserver_results.txt
的输出。以下是我尝试过的几种方法:
run("hive -e 'show tables;' 2>/dev/null")
:这会将 hive 的 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
,也可以复制到本地机器。