[英]Python subprocess (incorrectly?) merging stderr and stdout for ssh
[英]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.