Вызов подпроцесса Python sudo без пароля - PullRequest
0 голосов
/ 05 октября 2018

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

В частности, он может выполнять некоторые команды nginx без пароля, поэтомупока все хорошо.Проблема, с которой я сталкиваюсь, возникает, когда у меня есть скрипт на python, который заботится о проверке обновлений и, если есть изменения, пытается перезагрузить nginx.Как показано ниже

Popen(['sudo', 'nginx', '-T'], stdin=PIPE, stdout=PIPE, stderr=PIPE) 
call(["sudo", "systemctl", "reload", "nginx.service"])

Когда сценарий достигает одного из этих шагов, в терминале появляется запрос на ввод пароля, который не требуется, поскольку пользователь, выполняющий сценарий, имеет разрешения на запуск команд.без ввода.

Вопрос: Может быть, есть способ, без жесткого кодирования пароля в переменной, сказать сценарию «наследовать» разрешения пользователя при его запуске?

Некоторая дополнительная информация:

  • Если сам скрипт вызывается с помощью sudo, все работает, но, к сожалению, это не вариант, и sudo следует использовать только для тех частей, которые в нем полностью нуждаются (перезагрузка nginx)
  • Python версия 3.5

РЕДАКТИРОВАТЬ: Решено это благодаря другу:

Решением было добавить параметр PopShell = True в Popen.

Popen('sudo nginx -T'], shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)

1 Ответ

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

Возможно, проблема в том, что существует несоответствие в пути nginx sudoers и переменной PATH, используемой во время выполнения скрипта.

Попробуйте либо сопоставить вызов Popen с полным PATH, указанным в файле sudoers, либо настроить PATH в оболочке, вызывающей скрипт Python.

...