超时异常:子进程超过时间限制

0 投票
1 回答
537 浏览
提问于 2025-04-18 09:16

我正在使用Python的subprocess模块来运行ssh命令,以收集我服务器的磁盘使用情况。现在我遇到的问题是,如果某个服务器没有配置ssh,subprocess就会要求输入密码,这样我的整个脚本就会卡住,我只能手动终止脚本。我希望它能跳过那些需要密码输入的服务器(也就是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 个回答

3

如果你只是想避免 ssh 询问你任何东西,那你可以禁止它这样做。

你可以使用 SSH 的一个选项:

BatchMode

如果设置为“yes”,那么它就不会再询问你输入密码或密钥了。这个选项在脚本和其他批处理任务中非常有用,因为在这些情况下没有用户在场来输入密码。这个选项的值必须是“yes”或“no”,默认值是“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)

这样更简洁、安全,而且内部实现也更简单。

撰写回答