繁体   English   中英

在执行ssh时,子进程stdout和stderr

[英]subprocess stdout and stderr while doing ssh

我想知道远程服务器的磁盘使用情况,我想到了使用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都打开( BatchMode=yes ),但是我希望用户知道为什么没有输出。

当我在未配置ssh的服务器的外壳程序上运行相同的命令时,出现以下错误:

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

我希望在未配置ssh的特定服务器的脚本输出中出现相同的错误。

有任何想法吗?

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

要从stderr获取输出,必须像对stdout一样将stderr=subprocess.PIPE subprocess.PIPE传递给Popen。

如果您的本地计算机具有静态ip,我建议您使用套接字,以便您的数据使用脚本将连接到您的本地计算机并传递数据。 或者您是否具有通过urllib将服务器信息发布到Web应用程序的域。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM