我们有几十个同时运行的Amazon EC2 spot实例。我们必须迭代所有这些实例并执行一些命令。但有时登录失败的原因不明(可能是网络问题或其他)。所以在某些情况下,面料不断要求输入密码,但我不希望它这样做。
代码:
env.hosts = [ip]
env.reject_interactive_password = True
env.hosts = ['%s@%s' % ('ubuntu', 'PASSWORD')]
env.host_string = '%s@%s' % ('ubuntu', ip)
env.user = 'ubuntu'
env.password = 'PASSWORD'
env.reject_unknown_hosts = False
env.disable_known_hosts = True
env.warn_only = True
run('some command')
正如您所看到的,我添加了reject_interactive_password,但遗憾的是它不起作用。如您所知,我们的循环在某个实例上挂起,我们无法联系到其他实例(这是一个问题)。
由于某些原因,我们不使用ssh证书,只使用基于密码的身份验证。
我们使用PIP的最新面料。
那么如何防止面料问密码呢?谢谢!
答案 0 :(得分:0)
您确定该结构提示输入密码而不是另一端的sudo
提示吗?请查看fabric troubleshooting page,了解如何找出 提示的人。
请查看使用env.passwords,因为您可以为每个主机字符串指定密码。你不应该这样做,但知道你可以做到这一点很好。如果您的命令没有利用shell语法,您可能还想尝试使用env.use_shell选项。我尝试了许多这些选项来克服一些类似的交互式密码提示。最终,我们开始使用基于SSH密钥的访问,因为它更简洁,更可靠。
答案 1 :(得分:0)
我发现'提示中止'选项。它在任何输入提示符上执行sys.exit()。这不是我需要的,我看到有些人希望它也能跳过这种事情,而不是终止。但好吧,我可以捕获退出信号并跳过当前主机。这不是一件好事,可能有副作用,但可能被接受作为临时解决方案。
答案 2 :(得分:0)
我假设您希望脚本在获得异常后继续运行。您可以调整连接超时并将代码包装在try: ... except:
子句中。您可以捕获超时时获得的异常,只显示消息而不退出。