在使用ssh时处理subprocess的stdout和stderr

0 投票
2 回答
529 浏览
提问于 2025-04-18 12:06

我想知道远程服务器的磁盘使用情况,所以我想通过ssh来实现。以下是我目前的进展:

def disk_usage(server):
    msg=""
    ps = subprocess.Popen(["ssh", "-o", "BatchMode=yes", "-l", "mygroup", server, "df -k /some/directory"], stdout=subprocess.PIPE)
    out, err = ps.communicate()
    if err != None:
        msg += "\n"+err
    else:
        msg = out
    return msg

Final_msg = ""
server_list= ['server A','server B','server C']

for server in server_list:
   Final_msg+="For Server :"+server+"\n"+disk_usage(server)
print Final_msg

这个脚本运行得不错,但问题是,如果某个服务器的ssh没有配置,它就会显示一个空白的输出。

输出结果是:

For Server A :
Filesystem           1K-blocks      Used     Available     Use%   Mounted on
/dev/cfd/ace      8064048         3581524   4072892         47%     /app
For Server B :

For server C :
Filesystem           1K-blocks      Used     Available      Use%   Mounted on
/dev/wsa/ace      306423            244524   23243434       90%     /app

因为服务器B的ssh没有配置,所以我得到了一个空白的输出。这是因为所有的ssh连接都设置了批处理模式(BatchMode=yes),但我希望用户能知道为什么没有输出。

当我在没有配置ssh的服务器上运行相同的命令时,我会得到下面的错误信息:

 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

我希望在脚本的输出中也能看到这个特定服务器的错误信息,因为它的ssh没有配置。

有没有什么好主意?

2 个回答

0

如果你的本地电脑有一个固定的IP地址,我建议你使用套接字,这样你的数据使用脚本就可以连接到你的本地电脑并传送数据。或者,如果你有一个域名,可以通过urllib把你的服务器信息发送到你的网页应用。

0

要检测是否发生了错误,你需要查看 Popen 对象(也就是 ps)的 returncode 属性。

如果想要获取来自 stderr 的输出,你需要像处理 stdout 一样,把 stderr=subprocess.PIPE 传递给 Popen。

撰写回答