Запускать скрипт от имени пользователя 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

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

MountainX
источник
Да, это работает! Это отличная альтернатива сценариям mdms /etc/mdm/PostLogin/в мире Ubuntu !!
Адам Рычковски
У вас есть подобное решение в systemd? ... Ср. askubuntu.com/questions/847930/…
Адам
0

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

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

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

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

user26687
источник
Но Антонио Санчес ищет, как запустить скрипт, root когда конкретный пользователь входит в систему .
Элия ​​Каган
Скрипт должен запускаться независимо, сессия является графической или стандартной оболочкой. Я обновил заголовок, чтобы отметить это. Я прочитал кое-что об Upstart, но это выглядит сложным для (очевидно) простой задачи. В любом случае и до сих пор Upstart, кажется, единственный способ сделать это. Если вы знаете Upstart, будет ли сложно достаточно узнать, как выполнить эту работу? Спасибо!
Антонио Санчес