1

在我的/etc/sudoers我有:

# Allow the picky user to restart its own gunicorn process
picky ALL=(ALL) NOPASSWD: /usr/bin/supervisorctl restart picky

我确实可以从挑剔的用户那里运行这个命令:

$ su picky
$ sudo supervisorctl restart picky

在我的 fabfile.py 我有以下内容:

from fabric.api import sudo

def restart():
    sudo("supervisorctl restart picky")

但是,当我运行我的结构文件时,它仍然提示输入密码:

[picky@myhost] sudo: supervisorctl restart picky
[picky@myhost] out: sudo password: 

如何在 Fabric 中运行 sudo 命令,这样我就不需要提供密码?

编辑

我注意到这有效:

from fabric.api import run

def restart():
    run("sudo supervisorctl restart picky")
4

2 回答 2

4

https://stackoverflow.com/questions/3737003/can-i-prevent-fabric-from-prompting-me-for-a-sudo-password中所述,当您使用结构sudo命令时,该命令将发送到外壳. 执行的实际命令包含对其中的调用/bin/bash,这就是它与您的 sudoer 条目不匹配的原因。

要解决这个问题,只需添加shell=False到您的通话中:

from fabric.api import sudo

def restart():
    sudo("supervisorctl restart picky", shell=False)

您可能必须将完整路径添加到supervisorctl.

于 2014-01-15T16:32:22.223 回答
1

我注意到了两个项目;您的语法可能不正确,并且您可能在文件的后面有覆盖该语法的规则。

我会将您的picky条目更改为picky ALL=NOPASSWD:ALL,将其放在文件的末尾(或至少在其他类似于 的条目之后root ALL=(ALL:ALL) ALL)并查看它是否有效。如果是这样,则将其更改为picky ALL=NOPASSWD:/usr/bin/supervisorctl restart picky并查看是否有效。它应该。

于 2013-09-06T21:39:03.863 回答