超过一定时间限制时的子进程超时

时间:2014-06-10 11:41:24

标签: python subprocess

我使用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)

任何帮助将不胜感激! :)

1 个答案:

答案 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)

因为它更清洁,更安全,内部更简单。