Подтвердить что ты не робот

Запуск команды в качестве суперпользователя из python script

Итак, я пытаюсь запустить процесс как суперпользователя из python script с помощью подпроцесса. В оболочке ipython что-то вроде

proc = subprocess.Popen('sudo apach2ctl restart',
                        shell=True, stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)

работает нормально, но как только я вставляю его в script, я начинаю получать: sudo: apach2ctl: command not found.

Я бы предположил, что это связано с тем, как sudo обрабатывает среды на ubuntu. (Я также пробовал sudo -E apche2ctl restart и sudo env path=$PATH apache2ctl restart безрезультатно)

Итак, мой вопрос в основном, если я хочу запустить apache2ctl restart как суперпользователя, который запрашивает у пользователя пароль суперпользователя, когда это необходимо, как мне это сделать? Я не собираюсь хранить пароли в script.

Edit:

Я пробовал передавать команды как строку, так и обозначаемую в списке. В интерпретаторе python со строкой я получу правильную подсказку пароля (все еще не работает в python script, как в моей исходной проблеме), список просто дает экран справки для sudo.

Изменить 2:

Итак, я понимаю, что, хотя Popen будет работать с некоторыми командами так же, как строки, когда shell = True, требуется

proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])

без 'shell = True', чтобы заставить sudo работать.

Спасибо!

4b9b3361

Ответ 1

Попробуйте указать полный путь к apache2ctl.

Ответ 2

Try:

subprocess.call(['sudo', 'apach2ctl', 'restart'])

Подпроцесс должен получить доступ к реальному stdin/out/err, чтобы он мог запросить вас и прочитать ваш пароль. Если вы настроите их как трубы, вам необходимо самостоятельно подать пароль в этот канал.

Если вы их не определяете, он захватывает sys.stdout и т.д.

Ответ 3

Другой способ - сделать ваш пользователь без пароля sudo user.

Введите в командной строке следующее:

sudo visudo

Затем добавьте следующее и замените <username> на свой:

<username> ALL=(ALL) NOPASSWD: ALL

Это позволит пользователю выполнить команду sudo без необходимости запрашивать пароль (включая приложение, запущенное указанным пользователем. Это может быть риск безопасности, хотя

Ответ 4

Вы должны использовать Popen следующим образом:

cmd = ['sudo', 'apache2ctl', 'restart']
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Он ожидает список.