2009-06-11 3 views
0

Мне нужен способ выполнить модуль os.system() как разные UID. Он должен был бы вести себя аналогично следующему коду BASH (заметьте, это не точные команды я исполняющие):Выполнение команд оболочки как заданный UID в Python

su user1 
ls ~ 
mv file1 
su user2 
ls ~ 
mv file1 

Целевая платформа GNU Linux Generic.

Конечно, я мог бы просто передать их в модуль os.system, но как отправить пароль? Конечно, я могу запустить скрипт как root, но это неряшливо и неуверенно.

Желательно, чтобы я хотел был бы сделать, не требуя, чтобы пароли были в виде простого текста.

+0

У Дэвида Курнапо и Михеля Буддинга были хорошие моменты. Я буду использовать функцию os.seteuid() в сочетании с привилегированными пользователями (не root) для выполнения сценария. – Caedis

ответ

1

Функция, которую вы ищете, называется os.seteuid. Я боюсь, что вы, вероятно, не избежите выполнения скрипта как root, в любом случае, но я думаю, вы можете использовать фреймворк capabilities(7), чтобы «немного загнать» в выполнение, чтобы он мог изменять пользователей, но не делать любые другие вещи, которые может использовать суперпользователь.

В качестве альтернативы вы можете использовать с помощью PAM. Но, вообще говоря, не существует «опрятного» способа сделать это, и Дэвид Курнаоу абсолютно прав, что для административных скриптов традиционно запускается с привилегиями.

+0

@Vye Это была не опечатка, пожалуйста, воздержитесь от вредных изменений. – Erbureth

+0

Хороший улов, извините. – Vye

3

Я думаю, что это не тривиально: вы можете сделать это с помощью оболочки, потому что каждая команда запускается в свой собственный процесс, у которого есть свой собственный идентификатор. Но с python все будет иметь uid процесса, интерпретируемого python (конечно, если вы не запускаете подпроцессы, используя модуль подпроцесса и co). Я не знаю, как изменить пользователя процесса - я не знаю, возможно ли это, даже если это так, вам, по крайней мере, нужны привилегии администратора.

Что вы пытаетесь сделать точно? Например, это не похоже на правильную вещь для администрирования. Как правило, скрипты администратора выполняются в привилегированном пользователе - поскольку никто не знает пароль пользователя 2, кроме пользователя 2 (теоретически). Быть root означает, что пользователь всегда работает для «нормального» пользователя без запроса пароля.

+0

Справа, имеет смысл просто сделать отдельного привилегированного пользователя, который может выполнить скрипт с определенными повышенными правами. Более чистое решение, чем работа с правами root. – Caedis

2

возможно Судо может помочь вам в этом, в противном случае вы должны быть суперпользователем, чтобы выполнить os.setuid

в качестве альтернативы, если вы хотите получить удовольствие, вы можете использовать pexpect делать вещи что-то вроде этого, вы можете улучшить над этим

1

Где-то вдоль линии, какой-то процесс или какой-то другой понадобится эффективный UID 0 (root), потому что только такой процесс может установить эффективный UID произвольному другому UID.

В оболочке команда su является корневой программой SUID; он является привилегированным (POSIX-жаргон) и может устанавливать реальный и эффективный UID. Точно так же команда sudo может выполнять ту же работу. С помощью sudo вы также можете настроить, какие команды и UID разрешены. Важнейшим отличием является то, что su требует, чтобы пароль целевого пользователя позволял вам; sudo требует пароль пользователя, запускающего его.

Существует, конечно, вопрос о том, должен ли пользователь знать пароли других пользователей. В общем, ни один пользователь не должен знать пароль другого пользователя.

Сценарии изменений UID трудно.Вы можете сделать:

su altuser -c "commands to execute as altuser" 
sudo -u altuser commands to execute as altuser 

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

Работать вокруг подсказки сложно. Вы можете использовать инструменты, параллельные expect, которые обрабатывают псевдо-ttys для вас. Тем не менее, вы столкнулись с хранением паролей в сценариях (не очень хорошая идея) или каким-то образом изгоняете их из поля зрения.


Инструмент я использую для работы это один я написал, называется asroot. Это позволяет мне точно контролировать атрибуты UID и GID, которые должен иметь дочерний процесс. Но он предназначен только для того, чтобы использовать его, то есть во время компиляции указывается авторизованное имя пользователя (конечно, это можно изменить). Тем не менее, я могу сделать что-то вроде:

asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ... 

Это создает реальную и эффективную UID для «кого-то», устанавливает основную группу «theirgrp», удаляет все вспомогательные группы, и добавляет «othergrp» (так что процесс принадлежит только двум группам) и устанавливает umask на 0222; он затем выполняет «somecmd» с приведенными аргументами.

Для конкретного пользователя, который нуждается в ограниченном (или не ограниченном) доступе к другим учетным записям пользователей, это работает хорошо. Как общее решение, это не так жарко; sudo лучше во многих отношениях, но по-прежнему требует пароль (который asroot не делает).

 Смежные вопросы

  • Нет связанных вопросов^_^