Где-то на пути к тому или иному процессу или другому потребуется эффективный 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
, которые обрабатывают псевдо-тты для вас. Однако вы сталкиваетесь с необходимостью хранить пароли в скриптах (не очень хорошая идея) или каким-то образом скрывать их от глаз.
Инструмент, который я использую для работы, - тот, который я написал, называется asroot
. Это позволяет мне точно контролировать атрибуты UID и GID, которые должен иметь дочерний процесс. Но он предназначен только для того, чтобы я мог его использовать, то есть во время компиляции указывается авторизованное имя пользователя (конечно, это можно изменить). Тем не менее, я могу делать такие вещи, как:
asroot -u someone -g theirgrp -C -A othergrp -m 022 -- somecmd arg1 ...
Это устанавливает действительный и эффективный UID на «кого-то», устанавливает первичную группу на «их группы», удаляет все вспомогательные группы и добавляет «другие группы» (поэтому процесс принадлежит только двум группам) и устанавливает значение umask 0222. ; затем он выполняет 'somecmd' с заданными аргументами.
Для конкретного пользователя, которому нужен ограниченный (или не столь ограниченный) доступ к другим учетным записям, это работает хорошо. Как общее решение, это не так жарко; sudo
лучше во многих отношениях, но все равно требует пароль (а asroot
- нет).