Запускать скрипт от имени пользователя root при входе в систему (нет пользователя sudoer, сеанс оболочки)


8

Очень похоже /etc/profileи ~/.profileно запускается по руту, а не пользователь делает логин. /etc/rc.localзапускается после загрузки, но мне нужно запустить скрипт до входа в систему. Пользователь не sudoer один.

Спасибо!


Может быть способ сделать это, но это не будет похоже на /etc/profileто, ~/.profileпотому что выполнение кода в этих сценариях выполняется оболочкой пользователя и подчиняется контролю пользователя, тогда как если вы не хотите, чтобы пользователь имел возможность запускать программы как rootтаковые, тогда это должно быть выполнено какой-либо запущенной службой, внешней по отношению к процессам пользователя. ... Может помочь, если вы скажете нам цель скрипта, который вы хотите запустить.
Элия ​​Каган

Мне нужно выполнить одно конкретное (--bind) монтирование для одного конкретного пользователя. Я пробовал fstab с опциями владельца и пользователя, но он не работает. /etc/rc.local - это один из вариантов, но он всегда выполняет монтирование независимо от того, входит пользователь в систему или нет. В настоящее время я предоставил пользователю sudoer привилегии для «монтирования», но это обходной путь, и я не люблю предоставлять какие-либо привилегии обычным пользователям. Я думаю, что я буду использовать вместо rc.local. Спасибо!
Антонио Санчес

Вы можете создать корневой скрипт только с этой конкретной mountкомандой и дать пользователю право запускать только этот скрипт (настройка /etc/sudoers). Команда с заданными параметрами может быть установлена ​​непосредственно в sudoers.
энзотиб

Я уже пробовал таким образом. Дело в том, что когда наступает время для запуска «mount» внутри скрипта, снова «sudo» является обязательным, потому что скрипт запускается «пользователем», а не «root», так что в конце дня «mount» должен быть предоставлен и для пользователя, и вместо одного правила sudoers теперь у меня есть два. Это мой опыт, поэтому, пожалуйста, имейте в виду, что я не эксперт, и, возможно, я сделал что-то не так. Спасибо!
Антонио Санчес

Ответы:


3

Просто чтобы вернуться к методу sudoers, я думаю, что вы были почти там, прежде чем сдаться. Глядя на ваши последние комментарии, я просто хотел бы остановиться на том, что, вероятно, поможет вам:

Если вы запускаете скрипт от имени пользователя root, вам не нужно вызывать sudo из него.

У меня есть такой скрипт:

#! /bin/bash

echo $USER
whoami

Если я бегу, sudo ./myscriptя вижу rootвозвращение для обоих. Сеанс, в котором выполняется скрипт, является корневой оболочкой.

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

Так что напишите ваш скрипт, chownего rootи chmodего 700(чтобы только root мог запускать, читать или редактировать его), а затем просто позволить вашим пользователям запускать его через sudoers. Это должно работать.

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


2

Шаг 1. Создайте скрипт с помощью команды bind в любом редакторе. Например:

sudo emacs bind_user_directories.sh

содержание:

#!/bin/bash

#NOTE: this file would be placed in /usr/local/sbin/ folder as bind_user_directories.sh
#alternatively it could be placed in /etc/init.d/ ... (I guess)

### BEGIN INIT INFO
# Provides:          bind_user_directories
# Required-Start:    
# Required-Stop:     
# Should-Start:      $named
# Default-Start:     0 2 3 4 5 6 (I guess...)
# Default-Stop:      1
# Short-Description: mount --bind for a user
# Description:       runs mount --bind command for certain pre-defined directories for a specific user
### END INIT INFO

# What is this?
DESC="bind_user_directories"

# See how we were called.
case "$1" in

    start)
        log_progress_msg "bind directories for user..."
        sudo mount --bind /source/path /target/path
        log_progress_msg "done: bind directories for user"
        ;;

    stop)
        log_progress_msg "umount --bind directories for user..."
        sudo umount /target/path
        log_progress_msg "done: unbind directories for user"
        ;;

    restart)
        $0 stop
        sleep 1
        $0 start
        ;;

    *)
        #log_success_msg "Usage: bind_user_directories {start|stop|restart}"
        log_success_msg "Usage: service bind_user_directories <start|stop|restart>"
        exit 1
        ;;
esac

exit 0

Шаг 2. сохраните bind_user_directories.sh и сделайте его исполняемым:

chmod a+x bind_user_directories.sh

Шаг 3. свяжите его с подходящим местом, таким как / usr / local / sbin:

sudo ln -s bind_user_directories.sh /usr/local/sbin/bind_user_directories.sh

Шаг 4. Создайте скрипт upstart:

sudo emacs /etc/init/bind_user_directories.conf

содержание:

description "runs mount --bind command for certain pre-defined directories for a specific user"

start on filesystem and net-device-up IFACE!=lo

stop on runlevel [!023456]
console output
respawn
respawn limit 10 5

exec /usr/local/sbin/bind_user_directories.sh start

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


Да, это работает! Это отличная альтернатива сценариям mdms /etc/mdm/PostLogin/в мире Ubuntu !!
Адам Рычковски

У вас есть подобное решение в systemd? ... Ср. askubuntu.com/questions/847930/…
Адам

0

Чтобы запустить скрипт от имени пользователя root перед входом в систему

  1. Вы можете начать сценарий с Upstart .

  2. Вы можете добавить вызов сценария к существующим / GDM / KDM скриптов и т.д. запуска .

Примеры: Тема: FAQ: Автозапуск / Автозапуск, Периодический запуск .


Но Антонио Санчес ищет, как запустить скрипт, root когда конкретный пользователь входит в систему .
Элия ​​Каган

Скрипт должен запускаться независимо, сессия является графической или стандартной оболочкой. Я обновил заголовок, чтобы отметить это. Я прочитал кое-что об Upstart, но это выглядит сложным для (очевидно) простой задачи. В любом случае и до сих пор Upstart, кажется, единственный способ сделать это. Если вы знаете Upstart, будет ли сложно достаточно узнать, как выполнить эту работу? Спасибо!
Антонио Санчес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.