LINUX.ORG.RU

Запустить shell из python c sudo nopasswd

 ,


0

3

Привет.

Часть visudo:

zabbix  ALL=(root)      NOPASSWD:/usr/bin/scriptname optname
Часть скрипта:
import subprocess
myvar = subprocess.Popen(['/usr/bin/sudo', '/usr/bin/scriptname', 'optname'], stdout=subprocess.PIPE)
output = myvar.stdout.read()

Почему требует пароль? непойму.

Из под юзера:

# sudo -u zabbix -H /bin/bash
bash-4.1$ whoami
zabbix
bash-4.1$ ./mysuperscript.py
--------------
[sudo] password for zabbix: 
и если руками:
sudo /usr/bin/scriptname optname
Выдает норм результат.

★★★

Ты уверен, что этот скрипт запускаешь именно от пользователя, который с visudo?

И да, запустить ту же команду просто из шелла пробовал?

vurdalak ★★★★★ ()

Ты уверен что вызываешь именно из-под «zabbix» юзера?

dvrts ★★★ ()

Я бы использовал subprocess.check_output . По поводу sudo. Может у тебя опечатка там в пути? Попробуй без аргумента запустить. Ну и sudo работает только с абсолютным путём до бинаря. Говорю это на случай если приведённый тобой пример отличается от реального.

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Спасибо, я уже решил проблему.
Но не понимаю почему это работает.

subprocess.Popen("sudo /usr/bin/scriptname optname", shell=True, close_fds=True, stdout=subprocess.PIPE)
trofk ★★★ ()
Ответ на: комментарий от trofk

Я в своё время прошёлся по многим граблям с sudo, но вот затрудняюсь сказать что не так. А без close_fds работает? А то sudo, например, понимает когда у него stdin не терминал. Но в данном случае вроде как это нерелевантно.

Ну и можно ещё серез strace посмотреть в чём различия. Я не стал это предлагать т.к. там может быть инфа которую ты нам не хочешь показывать.

true_admin ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.