Fabric:防止提示输入密码

0 投票
3 回答
1269 浏览
提问于 2025-04-18 04:52

我们有几十个亚马逊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 个回答

0

我猜你是希望你的脚本在遇到错误后还能继续运行。你可以调整一下连接超时的设置,然后把你的代码放在一个 try: ... except: 的结构里。这样的话,当你遇到超时错误时,可以捕捉到这个错误,简单地显示一条消息,而不是让程序直接退出。

0

我发现了一个叫“在提示时中止”的选项。这个选项会在任何输入提示时执行 sys.exit(),也就是直接退出程序。这并不是我真正需要的,我看到有些人也希望能跳过这种情况,而不是直接终止程序。不过没关系,我可以捕捉到这个退出信号,然后跳过当前的主机。虽然这不是个好办法,可能会有一些副作用,但可以当作一个临时解决方案。

0

你确定是fabric在要求输入密码,而不是其他地方像sudo在提示吗?可以看看这个fabric故障排除页面,里面有一些方法可以帮助你搞清楚到底是谁在提示输入密码。

你可以试试使用env.passwords,这样你可以为每个主机指定不同的密码。虽然你不一定需要这样做,但知道有这个选项还是不错的。如果你的命令没有利用到shell语法,可能还想试试env.use_shell这个选项。我尝试过很多这些选项,以解决类似的交互式密码提示问题。最后,我们选择了使用基于SSH密钥的访问,因为这样更简单、更可靠。

撰写回答