在/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")
答案 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
并查看是否有效。它应该。