在执行ssh时子进程stdout和stderr

时间:2014-07-04 12:14:07

标签: python subprocess stdout stderr

我想知道远程服务器的磁盘使用情况,我想用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的服务器的shell上运行相同的命令时,我得到以下错误:

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

我想在没有配置ssh的特定服务器的脚本输出中出现相同的错误。

任何想法?

2 个答案:

答案 0 :(得分:0)

要检测是否发生了错误,您应该检查Popen对象的returncode属性(ps)。

要获得stderr的输出,您必须将stderr=subprocess.PIPE传递给Popen,就像对stdout一样。

答案 1 :(得分:0)

如果您的本地计算机具有静态IP,我建议使用套接字,以便您的数据使用脚本将连接到本地计算机并提供数据。 或者,如果您有域名,可以通过urllib将您的服务器信息发布到您的网络应用程序。