Fabric2 中的须藤

Sudo in Fabric2

我想重现我的旧 Fabric1 脚本的行为 运行

sudo('useradd -m -u --groups mygroup myuser')

在那种情况下,远程机器(一个 Ubuntu AWS 实例)会提示我输入我的 sudo 密码,我可以输入它。即使在输入错误后重复提示也可以。之后,Fabric1 将通过保持连接打开来保留该密码。

在我的新 Fabric 2.x 脚本中,我在 @task

中使用
c.sudo('useradd -m -u --groups mygroup myuser')

我仍然收到用户提示,但它没有等待我的响应,我无法输入密码,并且按预期失败

invoke.exceptions.AuthFailure: The password submitted to prompt '[sudo] password: ' was rejected

使用 --prompt-for-sudo-password 参数具有相同的效果(或无效)。

我也试过了

run('sudo useradd -m -u --groups mygroup myuser')

并收到

sudo: no tty present and no askpass program specified

我最好不要在没有 Fabric 1.x 的机器上设置 askpass 程序(除非我可以从我的脚本中做到这一点,我猜这需要 sudo)。

我一直在用头撞墙尝试使用复杂且没有很好记录的配置系统,但没有成功。

我错过了什么?如果需要额外的配置,我想知道配置文件的语法以及放置该文件的位置,以便 fab CLI 命令获取它。

在任务之前传入参数似乎很重要,因此请确保您不只是在命令末尾添加参数。例如,这失败了(不提示输入密码,然后 sudo 身份验证失败):

$ fab -H myhost mysudotask --prompt-for-sudo-password
[sudo] password: Sorry, try again.
[sudo] password: Traceback (most recent call last):
... <snip> ...
  File "<string>", line 2, in raise_from
invoke.exceptions.AuthFailure: The password submitted to prompt '[sudo] password: ' was rejected.

虽然以下按预期工作(提示输入密码,然后执行 sudo 任务):

$ fab -H myhost --prompt-for-sudo-password mysudotask 
Desired 'sudo.password' config value: 
[sudo] password: hi 1