Как запустить определенную программу с правами суперпользователя (ОС Ubuntu), когда в систему не вошел ни один пользователь sudo? Программа нуждается в привилегиях суперпользователя для правильной работы. Обычный пользователь не должен быть в состоянии остановить этот процесс. Например, у меня есть два пользователя, Admin и Client; Программа должна запускаться только тогда, когда клиент входит в систему. Ему нужны привилегии суперпользователя, и клиент не должен быть в состоянии остановить этот процесс.
2 ответа
Есть несколько способов сделать это. Графический вход в Ubuntu обеспечивается GDM (или KDM, если вы используете Kubuntu). GDM запускается подсистемой Upstart.
Процесс запуска выполняется следующим образом:
- Системные ботинки. Upstart запускает службы, включая GDM (/etc/init/gdm).
- GDM запускается, инициализирует X-сервер (/etc/gdm/Init/*) и представляет окно входа в систему с графическим интерфейсом.
- Пользователь входит в систему.
- Происходит авторизация PAM (/etc/pam.d/gdm)
- GDM запускает скрипт PostLogin (/etc/gdm/PostLogin/*).
- GDM запускает скрипт PreSession (/etc/gdm/PreSession/*).
- GDM запускает скрипты Xsession и xinit
(/etc/gdm/Xsession, /etc/X11/xinit/xinitrc.d/*, /etc/X11/Xsession, /etc/X11/Xsession.d/*)
- Появится рабочий стол пользователя.
Где запустить свой скрипт
Все до XSession запускается как root. /etc/gdm/Xsession и все остальное после запуска от имени пользователя. Это оставляет вам три реальных варианта, где запустить ваш скрипт.
Измените сценарии GDM/KDM PostLogin или PreSession для запуска вашей программы. Имя пользователя доступно в переменных среды USER или USERNAME.
Используйте PAM для выполнения вашего скрипта. PAM установит авторизующего пользователя в переменную окружения PAM_USER . Добавьте это в /etc/pam.d/gdm, чтобы запустить ваш скрипт:
auth required pam_exec.so /path/to/your/script
- Возможно, вы сможете использовать PAM для сопоставления с конкретным пользователем (как в этом ответе), поэтому сценарий будет запускаться только для этого пользователя и не должен будет сопоставлять пользователей сам. У меня нет опыта PAM, чтобы объяснить, как это сделать.
- Возможно, вы сможете использовать PAM для сопоставления с конкретным пользователем (как в этом ответе), поэтому сценарий будет запускаться только для этого пользователя и не должен будет сопоставлять пользователей сам. У меня нет опыта PAM, чтобы объяснить, как это сделать.
Напишите скрипт Upstart для запуска вашей программы. Ваш скрипт будет запускаться при входе пользователя в систему, поэтому мы ищем сигнал запуска сеанса рабочего стола , генерируемый скриптом PreSession GDM.
Таким образом, скрипт Upstart определит этот сигнал как триггер запуска:
# start when GDM's PreSession script runs start on desktop-session-start
Сигнал от PreSession не передается по имени пользователя, поэтому вам нужно настроить сигнал. В /etc /gdm /PreSession /Default найдите строку initctl и измените ее на эту. Вы также можете использовать USERNAME вместо USER.
# add USER variable so Upstart script can find it initctl -q emit desktop-session-start DISPLAY_MANAGER=gdm USER=$USER
Посмотрите man-страницы для Upstart и его стартового события для более подробной информации.
Как избежать пользователя Admin
Ваш сценарий должен проверить имя пользователя / пользователя в переменных среды, которые он получает от одного из этих методов, и использовать его, чтобы определить, следует ли прервать или продолжить. Стандартные методы сценариев оболочки будут работать. В зависимости от того, какое начальное местоположение вы выбрали из приведенного выше списка, имя пользователя может быть доступно в переменных среды USER, USERNAME или PAM_USER .
Вы можете использовать setuid, чтобы всегда запускать программу от имени пользователя root. С точки зрения безопасности, это, вероятно, очень, очень плохая идея. Если одному из ваших пользователей удалось использовать программу setuid, он предоставит им root-доступ ко всему серверу.