在Fabric2中的Sudo

Fal*_*ter 7 python sudo fabric

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

sudo('useradd -m -u --groups mygroup myuser')
Run Code Online (Sandbox Code Playgroud)

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

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

c.sudo('useradd -m -u --groups mygroup myuser')
Run Code Online (Sandbox Code Playgroud)

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

invoke.exceptions.AuthFailure: The password submitted to prompt '[sudo] password: ' was rejected
Run Code Online (Sandbox Code Playgroud)

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

我也试过了

run('sudo useradd -m -u --groups mygroup myuser')
Run Code Online (Sandbox Code Playgroud)

并收到

sudo: no tty present and no askpass program specified
Run Code Online (Sandbox Code Playgroud)

我最好不要在没有Fabric 1.x的情况下在一台完美运行的机器上设置askpass程序(除非我能从我的脚本那样做,这需要sudo,我猜).

我一直在撞墙试图使用复杂且没有完善记录的配置系统,但没有成功.

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

Pet*_*son 5

在任务之前传递参数似乎很重要,因此请确保您不只是在命令末尾添加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.
Run Code Online (Sandbox Code Playgroud)

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

$ fab -H myhost --prompt-for-sudo-password mysudotask 
Desired 'sudo.password' config value: 
[sudo] password: hi 1
Run Code Online (Sandbox Code Playgroud)