超时异常:子进程超过时间限制
我正在使用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)
这样更简洁、安全,而且内部实现也更简单。