Вызов команд /etc/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: 

Как я могу запускать команды sudo внутри Fabric, чтобы мне не нужно было вводить пароль?

Изменить:

Я заметил, что это работает:

from fabric.api import run

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

person Wilfred Hughes    schedule 03.09.2013    source источник


Ответы (2)


Как указано в https://stackoverflow.com/questions/3737003/can-i-prevent-fabric-from-prompting-me-for-a-sudo-password, когда вы используете команду Fabric sudo, эта команда отправляется в оболочку. Реальная выполняемая команда содержит в себе вызов /bin/bash, поэтому она не совпадает с вашей записью sudoer.

Чтобы обойти это, просто добавьте shell=False к вашему вызову:

from fabric.api import sudo

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

Возможно, вам придется добавить полный путь к supervisorctl.

person shezi    schedule 15.01.2014
comment
Работал как шарм! Добавление полного пути к supervisorctl было излишним. - person Wilfred Hughes; 17.01.2014

Я заметил два предмета; ваш синтаксис может быть неправильным, и у вас могут быть правила, которые переопределяют это позже в файле.

Я бы изменил вашу запись picky на picky ALL=NOPASSWD:ALL, поместил ее в КОНЕЦ файла (или, по крайней мере, после других записей, похожих на root ALL=(ALL:ALL) ALL) и посмотрел, работает ли она. Если это так, измените его на picky ALL=NOPASSWD:/usr/bin/supervisorctl restart picky и посмотрите, сработает ли это. Должно.

person dicato    schedule 06.09.2013
comment
Это последнее правило в файле. Изменение правила на picky ALL=(ALL) NOPASSWD:ALL заставит работать скрипт структуры, но, конечно, не ограничивает команды. Изменение правила на picky ALL=NOPASSWD:/usr/bin/supervisorctl restart picky не меняет поведение. - person Wilfred Hughes; 11.09.2013