从fabric调用/ etc / sudoers命令

时间:2013-09-03 22:04:01

标签: python fabric sudoers

/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")

2 个答案:

答案 0 :(得分:3)

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

要解决此问题,只需在通话中添加shell=False

from fabric.api import sudo

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

您可能需要添加supervisorctl的完整路径。

答案 1 :(得分:1)

我注意到的两件事;您的语法可能不正确,您可能会在以后的文件中覆盖此规则。

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