Fabric2中的Sudo

时间:2018-06-28 23:45:43

标签: python sudo fabric

我想重现我运行的旧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命令获取。

1 个答案:

答案 0 :(得分:4)

在任务之前传递参数似乎很重要,因此请确保您不只是在命令末尾加上args。例如,此操作失败(不提示输入密码,然后使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