#python #file #admin
Вопрос:
У меня проблема. Я пишу часть программного обеспечения, которая необходима для выполнения операции, требующей, чтобы пользователь находился в режиме sudo. запуск ‘sudo python filename.py-это не вариант, что подводит меня к моему вопросу. Есть ли способ перейти на sudo на полпути через скрипт python, безопасность не является проблемой, так как пользователь будет знать пароль sudo, который программа должна запустить следующим образом, чтобы проиллюстрировать проблему
- программа работает как обычный пользователь
- …… выполнение операций
- пользователь вводит пароль sudo
- пользователь изменен на sudo
- запускается подпрограмма, требующая разрешения sudo
- при четном срабатывании (завершение подпрограммы) пользователь снова становится обычным пользователем
- …… выполнение операций
Моя проблема заключается в шаге 3, любые указатели или рамки, которые вы могли бы предложить, окажут большую помощь.
Овации
Крис
Комментарии:
1. Идеальное решение, я думаю, будет обладать следующими качествами, независимо от того, возможно это или нет: 1. Оно не требует перезапуска сценария. 2. Это не предполагает вызова второго скрипта Python в скрипте Python. 3. Привилегии root применимы только к указанной части сценария (а не к началу и не обязательно к концу).
Ответ №1:
Лучше запускать как можно меньше программ с повышенными привилегиями. Вы можете запустить небольшую часть, для которой требуется больше привилегий, с помощью subprocess.call()
функции, например
import subprocess
returncode = subprocess.call(["/usr/bin/sudo", "/usr/bin/id"])
Ответ №2:
Не пытайтесь сделать себя судо, просто проверьте, так ли это, и ошибитесь, если нет
class NotSudo(Exception):
pass
if os.getuid() != 0:
raise NotSudo("This program is not run as sudo or elevated this it will not work")
Комментарии:
1. Разве этого не должно быть
os.geteuid() != 0
?2. Это не очень хорошее решение — что, если только части скрипта требуют root?
3. Вопрос, в частности, требовал, чтобы не запускалась вся программа с повышенным уровнем.
4. @JakobBowyer, кто знал, что судо все еще будет рядом?
5. @thorr18 Другие сайты против публикации в старых темах, но переполнение стека прозрело и поощряет задавать вопросы с ответами, которые будут полезны другим, которые появятся позже, а это означает, что важно исправлять или указывать на проблемы со старыми ответами.
Ответ №3:
Недавно я столкнулся с этой проблемой при создании сценария установки системы. Чтобы переключиться на права суперпользователя, я использовал subprocess.call() с ‘sudo’:
#!/usr/bin/python
import subprocess
import shlex
import getpass
print "This script was called by: " getpass.getuser()
print "Now do something as 'root'..."
subprocess.call(shlex.split('sudo id -nu'))
print "Now switch back to the calling user: " getpass.getuser()
Обратите внимание, что вам нужно использовать shlex.split()
, чтобы сделать вашу команду полезной для subprocess.call()
. Если вы хотите использовать выходные данные команды, вы можете использовать subprocess.check_output()
. Существует также пакет под названием » sh » (http://amoffat.github.com/sh/), которые вы можете использовать для этой цели.
Комментарии:
1. sudo: нет tty и не указана программа askpass
Ответ №4:
Используйте Tcl и ожидайте, плюс подпроцесс, чтобы повысить себя. Так что в основном это выглядит так:
sudo.tcl
spawn sudo
expect {
"Password:" {
send "password"
}
}
sudo.py
import subprocess
subprocess.call(['tclsh', 'sudo.tcl'])
А потом беги sudo.py.
Комментарии:
1. Я получаю
invalid command name "spawn"
, когда запускаю скрипт на Python (со всем в точности так, как у вас здесь). Что я должен делать по-другому?2. Возможно, использование
pexpect
модуля Python иpexpect.spawnu
класса будет полезно при создании решения на основе всего Python. Если вы знаете, как его использовать, не стесняйтесь редактировать это в своем ответе. (Не то чтобы мне нужно решение на основе всего Python. Пока это работает на меня, это здорово.)3. Мне нужно полное решение на python для этого. У тебя есть такой?
Ответ №5:
Если вы можете инкапсулировать только необходимые функции, требующие повышенных привилегий, в отдельный исполняемый файл, вы можете использовать бит setuid в исполняемой программе и вызвать его из своего пользовательского скрипта python.
Таким образом, только действие в исполняемом файле setuid выполняется от имени root, однако для его выполнения НЕ требуется sudo, т. Е. привилегии root. Только для создания/изменения исполняемого файла setuid требуется sudo.
Существует несколько последствий для безопасности, таких как обеспечение того, чтобы ваша исполняемая программа setuid должным образом обрабатывала любой пользовательский ввод (например, параметры), чтобы ее нельзя было обманом заставить делать то, что она не должна (проблема с заместителем).
ссылка: http://en.wikipedia.org/wiki/Setuid#setuid_on_executables
изменить: setuid, похоже, работает только для скомпилированных исполняемых файлов (двоичных файлов), а не интерпретируемых сценариев, поэтому вам может потребоваться использовать скомпилированную оболочку setuid.
Комментарии:
1. Мм, автор просит скрипты на python, так что, как вы написали, setuid бесполезен.
Ответ №6:
Вы можете использовать setuid для установки идентификатора пользователя. Но по очевидным соображениям безопасности вы можете сделать это только в том случае, если вы являетесь пользователем root (или программа имеет права суперпользователя). И то, и другое, вероятно, плохая идея.
В этом случае вам нужны права sudo для запуска определенной программы. В этом случае просто перейдите к «sudo theprogram» вместо этого.
Ответ №7:
import subprocess
subprocess.check_output("sudo -i -u " str(username) " ls -l", shell=True).decode("utf-8").strip()
Ответ №8:
Вы говорите о том, чтобы ввести пароль пользователя на полпути к выполнению? функция raw_input() может принимать пользовательский ввод из консоли, но она не будет маскировать пароль.
>>>> y = raw_input()
somehting
>>> y
'somehting'
Комментарии:
1. Нет. Мы говорим о разрешениях, хотя программы, предоставляющие разрешения, как правило, запрашивают пароли (но это не ключевой элемент). (Например, использовать что-то
sudo
на полпути через программу без использования второго сценария или что-то в этом роде.)