我使用python的子进程模块在我的服务器上运行ssh命令来收集磁盘使用情况。我遇到的一件事就是如果ssh
没有在任何服务器中配置,那么密码输入的子进程提示会使我的整个脚本卡住,然后我必须自愿杀死脚本本身。我只是希望它放弃所有要求输入密码的服务器(没有配置ssh)并继续处理其余的服务器。
def MyFunction(server):
msg=""
ps = subprocess.Popen("ssh -l mygroup %s 'df -k /some/directory'" % server,stdout=subprocess.PIPE,shell=True)
out, err = ps.communicate()
if err != None:
msg += "\n"+err
else:
msg = out
return msg
server_list= ['server A','server B','server C','server D']
for server in server_list:
Final_msg+=MyFunction(server)
任何帮助将不胜感激! :)
答案 0 :(得分:3)
如果只是你要避免的事情ssh
要求你做任何事情,那么你可以禁止它这样做。
您可以使用SSH选项
批处理模式
如果设置为“yes”,将禁用密码/密码查询。 此选项在脚本和其他没有用户提供密码的批处理作业中很有用。 论证必须是“是”或“否”。默认为“no”。
所以只需添加-o BatchMode=yes
:
ps = subprocess.Popen("ssh -o BatchMode=yes -l mygroup %s 'df -k /some/directory'" % server, stdout=subprocess.PIPE, shell=True)
顺便说一句,为什么你需要shell=True
?做得更好
ps = subprocess.Popen(["ssh", "-o", "BatchMode=yes", "-l", "mygroup", server, "df -k /some/directory"], stdout=subprocess.PIPE)
因为它更清洁,更安全,内部更简单。