Подтвердить что ты не робот

Измените пользователя sudo на python script

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

  • программа работает как обычный пользователь
  • ...... выполнение операций
  • пользователь вводит пароль sudo
  • Пользователь изменен на sudo
  • выполняется подпрограмма, требующая разрешения sudo.
  • на триггере (конец подпрограммы) пользователь снова становится обычным пользователем.
  • ...... выполнение операций

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

Приветствия

Крис

4b9b3361

Ответ 1

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

sudo.tcl

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

sudo.py

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

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

Ответ 2

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

import subprocess
returncode = subprocess.call(["/usr/bin/sudo", "/usr/bin/id"])

Ответ 3

Не пытайтесь сделать сам 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")

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

исх: http://en.wikipedia.org/wiki/Setuid#setuid_on_executables

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

Ответ 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'