Где-то вдоль линии, какой-то процесс или какой-то другой понадобится эффективный 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
не делает).
У Дэвида Курнапо и Михеля Буддинга были хорошие моменты. Я буду использовать функцию os.seteuid() в сочетании с привилегированными пользователями (не root) для выполнения сценария. – Caedis