Запустите системную команду Linux в качестве суперпользователя, используя скрипт Python - PullRequest
16 голосов
/ 24 февраля 2009

У меня установлен постфикс на моей машине, и я обновляю virtual_alias на лету программно (используя python) (при некоторых действиях). Когда я обновляю запись в / etc / postfix / virtual_alias, я запускаю команду:

sudo /usr/sbin/postmap /etc/postfix/virtual_alias 2>>/work/postfix_valias_errorfile
Но я получаю ошибку:
sudo: sorry, you must have a tty to run sudo

Я хочу выполнить упомянутую команду sudo нечеловеческим образом (то есть, я запускаю эту системную команду из сценария python). Так как мне запустить эту команду программно?

Ответы [ 6 ]

20 голосов
/ 24 февраля 2009

Вы можете запустить скрипт python как сам root - тогда вам не нужно будет добавлять привилегии для перезагрузки постфикса.

Или вы можете настроить sudo, чтобы пароль не требовался для /etc/init.d/postfix.

Конфигурация sudo (через visudo) позволяет NOPASSWD: разрешить команду без пароля. Смотри http://www.sudo.ws/sudo/man/sudoers.html#nopasswd_and_passwd

<username>  ALL = NOPASSWD: /etc/init.d/postfix

или что-то подобное.

5 голосов
/ 24 февраля 2009
#include <unistd.h>
#include <stdlib.h>

// gcc -o reload_postfix reload_postfix.c
// chown root reload_postfix
// chmod +s reload_postfix

int main( int argc, char **argv ) {
    setuid( geteuid() );
    system("/etc/init.d/postifx reload");
}

Оберните вашу команду в установленную программу. Это позволит любому пользователю перезапустить постфикс. Конечно, вы можете дополнительно ограничить разрешение на выполнение определенными группами.

3 голосов
/ 06 марта 2009

Чтобы ответить на ошибку: «sudo: извините, у вас должен быть tty для запуска sudo», в файле sudoers есть настройка под названием «Defaults requiretty». Я попытался закомментировать это, и это сработало: D.

2 голосов
/ 24 февраля 2009
import os
os.popen("sudo -S /etc/init.d/postifx reload", 'w').write("yourpassword")

Это, конечно, почти всегда не очень хорошая идея, так как пароль в текстовом виде.

0 голосов
/ 11 октября 2018

См. StackLick

Вам необходимо предоставить пользователю команду sudo без пароля.

0 голосов
/ 18 февраля 2013

если вы собираетесь сделать это в Python, вам нужно просто сделать следующее:

написать эту команду перед строкой, в которую вы вызываете команду оболочки

os.setuid(os.geteuid())

затем вы вызываете команду оболочки без префикса "sudo"

...