Fabric:防止提示输入密码
我们有几十个亚马逊EC2的临时实例同时在运行。我们需要对这些实例进行遍历,并执行一些命令。但是,有时候登录会失败,原因不明(可能是网络问题或者其他原因)。所以在某些实例上,fabric一直在要求输入密码,但我不想让它这样做。
代码如下:
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证书,只使用基于密码的认证。
我们使用的是最新的fabric版本,来自PIP。
那么,有什么办法可以让fabric根本不询问密码吗?谢谢!
3 个回答
我猜你是希望你的脚本在遇到错误后还能继续运行。你可以调整一下连接超时的设置,然后把你的代码放在一个 try: ... except:
的结构里。这样的话,当你遇到超时错误时,可以捕捉到这个错误,简单地显示一条消息,而不是让程序直接退出。
我发现了一个叫“在提示时中止”的选项。这个选项会在任何输入提示时执行 sys.exit(),也就是直接退出程序。这并不是我真正需要的,我看到有些人也希望能跳过这种情况,而不是直接终止程序。不过没关系,我可以捕捉到这个退出信号,然后跳过当前的主机。虽然这不是个好办法,可能会有一些副作用,但可以当作一个临时解决方案。
你确定是fabric在要求输入密码,而不是其他地方像sudo
在提示吗?可以看看这个fabric故障排除页面,里面有一些方法可以帮助你搞清楚到底是谁在提示输入密码。
你可以试试使用env.passwords,这样你可以为每个主机指定不同的密码。虽然你不一定需要这样做,但知道有这个选项还是不错的。如果你的命令没有利用到shell语法,可能还想试试env.use_shell这个选项。我尝试过很多这些选项,以解决类似的交互式密码提示问题。最后,我们选择了使用基于SSH密钥的访问,因为这样更简单、更可靠。