Изменить на пользователя sudo в скрипте Python - PullRequest
23 голосов
/ 04 марта 2011

У меня проблема.Я пишу часть программного обеспечения, которое требуется для выполнения операции, которая требует, чтобы пользователь находился в режиме sudo.запуск 'sudo python filename.py' не вариант, что приводит меня к моему вопросу.Есть ли способ перейти на sudo на полпути через скрипт на python, безопасность не является проблемой, поскольку пользователь будет знать пароль sudo, который программа должна запустить следующим образом, чтобы проиллюстрировать проблему

  1. программа работает как обычный пользователь
  2. ...... выполняет операции
  3. пользователь вводит пароль sudo
  4. пользователь изменен на sudo
  5. подпрограмма, требующая разрешения sudoвыполняется
  6. при четном триггере (конец подпрограммы) пользователь снова становится обычным пользователем
  7. ...... выполняет операции

Моя проблема заключается в шаге3, любые указатели или рамки, которые вы могли бы предложить, были бы очень полезны.

Приветствия

Крис

Ответы [ 8 ]

18 голосов
/ 02 марта 2012

Лучше всего запускать как можно меньше программ с повышенными привилегиями.Вы можете запустить небольшую часть, которой требуются дополнительные права, с помощью функции subprocess.call(), например,

import subprocess
returncode = subprocess.call(["/usr/bin/sudo", "/usr/bin/id"])
9 голосов
/ 04 марта 2011

Не пытайтесь сделать себя sudo, просто проверьте, если вы есть, и ошибка, если вы не

class NotSudo(Exception):
    pass

if os.getuid() != 0:
    raise NotSudo("This program is not run as sudo or elevated this it will not work")
5 голосов
/ 26 ноября 2012

Я недавно имел дело с этой проблемой при создании сценария установки системы.Чтобы переключиться на разрешения суперпользователя, я использовал 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/), который вы можете использовать для этой цели.

2 голосов
/ 13 сентября 2014

Используйте Tcl и Expect, а также подпроцесс, чтобы поднять себя.В общем, это выглядит так:

sudo.tcl

spawn sudo
expect {
    "Password:" {
        send "password"
    }
}

sudo.py

import subprocess
subprocess.call(['tclsh', 'sudo.tcl'])

И затем запустите sudo.py.

2 голосов
/ 22 августа 2014

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

Таким образом, только действие в исполняемом файле setuid запускается от имени пользователя root, однако для его выполнения НЕ требуются права sudo, то есть права root. Только создание / изменение исполняемого файла setuid требует sudo.

Есть несколько последствий для безопасности, таких как обеспечение того, чтобы ваша исполняемая программа setuid должным образом дезинфицировала любой пользовательский ввод (например, параметры), чтобы ее нельзя было заставить сделать то, что не следует (запутанная проблема заместителя).

ссылка: http://en.wikipedia.org/wiki/Setuid#setuid_on_executables

edit: setuid, похоже, работает только для скомпилированных исполняемых файлов (двоичных файлов), а не для интерпретируемых сценариев, поэтому вам может понадобиться использовать скомпилированную оболочку setuid.

0 голосов
/ 11 апреля 2016
import subprocess
subprocess.check_output("sudo -i -u " + str(username) + " ls -l", shell=True).decode("utf-8").strip()
0 голосов
/ 11 сентября 2014

Вы говорите о том, чтобы вводить пароль пользователя на полпути во время исполнения?raw_input () может принимать пользовательский ввод с консоли, но он не будет маскировать пароль.

>>>> y = raw_input()
somehting
>>> y
'somehting'
0 голосов
/ 04 марта 2011

Вы можете использовать setuid для установки uid пользователя.Но по очевидным причинам безопасности вы можете сделать это только в том случае, если вы являетесь пользователем root (или у программы есть права suid root).Возможно, оба эти понятия плохие.

В этом случае вам необходимо иметь права sudo для запуска определенной программы.В этом случае просто вместо "sudo theprogram".

...