在使用ssh时处理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的服务器上运行相同的命令时,我会得到下面的错误信息:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
我希望在脚本的输出中也能看到这个特定服务器的错误信息,因为它的ssh没有配置。
有没有什么好主意?
2 个回答
0
如果你的本地电脑有一个固定的IP地址,我建议你使用套接字,这样你的数据使用脚本就可以连接到你的本地电脑并传送数据。或者,如果你有一个域名,可以通过urllib把你的服务器信息发送到你的网页应用。
0
要检测是否发生了错误,你需要查看 Popen 对象(也就是 ps
)的 returncode
属性。
如果想要获取来自 stderr
的输出,你需要像处理 stdout
一样,把 stderr=subprocess.PIPE
传递给 Popen。