Как запустить процесс от имени другого пользователя в Linux
Запуск процесса от имени другого пользователя в Linux — задача, которая может быть полезной для тестирования или разработки. В этой статье мы рассмотрим различные способы достижения этой цели, включая использование unshare, fakeroot и управление пространствами имен.
Почему нужно запускать процессы от имени другого пользователя?
Может возникнуть необходимость имитировать поведение системы в условиях, когда вы работаете под разными учетными записями. Это может быть полезно для тестирования, создания заметок или просто для понимания работы программ с разными правами доступа. Вам может потребоваться запускать команды от имени пользователей, у которых могут быть различные разрешения и ограничения.
Первые шаги с unshare
Команда unshare позволяет создавать новые пространства имен в Linux. Это означает, что вы можете создать отдельное пространство для управления пользователями и их идентификаторами. Пример команды, которую можно использовать для создания нового пространства имен:
unshare --user --map-root-user bash
Как вы могли заметить, попытка изменить владельца файла с помощью команды chown может вызвать ошибку, подобную этой:
chown: changing ownership of 'a': Invalid argument
Это происходит потому, что вам необходимо правильно сопоставить UID с использованием newuidmap.
Использование fakeroot
Если работа с unshare слишком сложна, можно попробовать команду fakeroot. Эта утилита создает "виртуальную" среду, в которой вы можете имитировать выполнение от имени другого пользователя без фактического использования прав администратора и создания новых учетных записей.
Пример использования:
fakeroot
touch a b
chown 1 a
chown 2 b
ls -l
Запуск скрипта с другой учетной записью
Теперь возникает вопрос: как запустить программу с другим UID, если соответствующей учетной записи не существует? Простая команда su не сработает:
su 3 ...
Вы получите сообщение об ошибке: No passwd entry for user '3'. Изменение целых пространств имен или создание новых учетных записей может показаться излишним для простых задач.
Настройка newuidmap
Чтобы использовать unshare с привилегированными операциями, такими как сопоставление пользователей, вам нужно убедиться, что ваши внутренние UID сопоставлены с внешними. Пример команды:
unshare -r --map-users=1:2000001:9
Это позволяет вашему пространству имен пользователей использовать определенные UID, начиная с 1, сопоставляя их с внешними UID, начинающимися с 2000001.
Использование setpriv
Как только пользовательские пространства имен настроены, вы можете использовать команду setpriv, чтобы запустить команды от имени произвольного UID:
setpriv --reuid=1 /bin/id
Создание изолированного пространства имен
Если вам нужно запускать sudo с различными учетными данными, вам может потребоваться создать изолированное пространство имен монтирования, чтобы монтировать измененные файлы /etc/passwd и /etc/group. Пример:
(unshare -r [...] -m)
mount --bind ~/passwd.fake /etc/passwd
mount --bind ~/group.fake /etc/group
Заключение
Запуск процессов от имени другого пользователя в Linux может быть сложной задачей, но используя инструменты, такие как unshare, fakeroot, и setpriv, вы можете упростить этот процесс. Понимание пространств имен и управления пользователями — ключ к успешной реализации этой возможности. Благодаря этой статье вы теперь обладаете необходимыми знаниями для работы с идентификаторами пользователей в Linux.



