Ответ 1
Попробуйте указать полный путь к apache2ctl.
Итак, я пытаюсь запустить процесс как суперпользователя из 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 работать.
Спасибо!
Попробуйте указать полный путь к apache2ctl.
Try:
subprocess.call(['sudo', 'apach2ctl', 'restart'])
Подпроцесс должен получить доступ к реальному stdin/out/err, чтобы он мог запросить вас и прочитать ваш пароль. Если вы настроите их как трубы, вам необходимо самостоятельно подать пароль в этот канал.
Если вы их не определяете, он захватывает sys.stdout и т.д.
Другой способ - сделать ваш пользователь без пароля sudo user
.
Введите в командной строке следующее:
sudo visudo
Затем добавьте следующее и замените <username>
на свой:
<username> ALL=(ALL) NOPASSWD: ALL
Это позволит пользователю выполнить команду sudo
без необходимости запрашивать пароль (включая приложение, запущенное указанным пользователем. Это может быть риск безопасности, хотя
Вы должны использовать Popen следующим образом:
cmd = ['sudo', 'apache2ctl', 'restart']
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Он ожидает список.