Проблема с запуском скрипта при загрузке от имени root?

Проблема с запуском скрипта при загрузке от имени root?

Главный вопрос:

Есть ли способ полностью запустить один из моих скриптов, когда появляется рабочий стол Ubuntu, независимо от того, вошел ли в систему root, администратор, пользователь рабочего стола или непривилегированный пользователь?

Что делает сценарий?

Скрипт монтирует раздел, ищет файл в этом разделе и, наконец, на основе этого файла принимается решение о копировании раздела в другой раздел. Это копирование выполняется через

dd if=/dev/sda2 of=/dev/sda5

Когда скрипт работает нормально?

Скрипт работает гладко, когда я запускаю его из терминала с помощью

sudo ./my_copying_script

Эта команда запрашивает у меня пароль текущего вошедшего в систему пользователя. Я ввожу пароль, и скрипт начинает работать.

Когда скрипт НЕ работает нормально?

Я хочу запустить скрипт при запуске. Я установил его в качестве программы запуска с помощьюСтартап приложенийутилита Ubuntu. Скрипт запустился при запуске, но завершился при команде dd, выдав следующую ошибку:

dd: opening '/dev/sda2': Permission denied 

НаэдкПредложение Я установил владельца my_copying_script как root и установил SUID. Теперь разрешения my_copying_script равны (-rwsr-sr-x).эдкТочка зрения была в том, что как только я устанавливаю suid, программа запуска будет работать с разрешениями ее владельца. Я так и сделал, но возникла та же ошибка /dev/sda2 permission denied.

Затем я добавил к dd префикс sudo, как указано ниже.

 sudo dd if=/dev/sda2 of=/dev/sda5

но это вернуло следующую ошибку:

sudo: no tty present and no askpass program specified

решение1

Усман, я думаю, у тебя есть как минимум два варианта, о которых я уже упоминал.

Самый простой способ

Создайте двоичный файл set-UID, который (проверит, кто его запустил, и разрешит использование, если владелец родительского процесса может его запустить) запустит подготовленный скрипт и выйдет. Поместите его в автозагрузку в вашем менеджере рабочего стола, вот и все. Просто имейте в виду, что это не лучший способ, и для этого потребуется немного кода на C. По сути, вам нужно создать код, подобный этому примеру:

int main(){
    setuid(0);
    system("/bin/sh /root/bin/mounts.sh");
}

Имейте в виду, что это хак, а не решение, на самом деле. И обязательно используйте root:allowed_group и права 4750 надвоичныйесли вам не нужно, чтобы его запускали все. Не забудьте добавить всех пользователей, которые могут запустить это, в allowed_group (выберите свое имя).

Хороший путь

Другой, гораздо лучший способ — создать своего рода демон, запускаемый при загрузке системы (например, из init-скриптов), но я не уверен, как именно вы собираетесь определять, когда запускается новый сеанс X, я еще не вникал в эту тему, поэтому не могу ничего сказать.прозрачныйсоветы здесь.

решение2

Затем установите правильные разрешения для пути к смонтированному диску, и все готово.

решение3

sudo запустит программу от имени другого пользователя только в том случае, если выполнено одно из трех условий (касательно паролей):

  1. указана опция NOPASSWD
  2. пользователь ввел правильный целевой пароль
  3. пользователь ввел правильный исходный пароль

Поскольку для вариантов 2 и 3 требуется TTY (sudo не будет читать из конвейера), он не запустится, если не сможет его найти. Проверьте свой скрипт, если в какой-то момент вы запускаете скрипт удаленно с помощью ssh, так как возможно, что он не выделит TTY для неинтерактивной удаленной команды.

Цитата из:Здесь

решение4

Возможным решением будет добавить вашего пользователя и команду, которую он пытается вызвать, в /etc/sudoers с параметром NOPASSWD. Вырезано из /etc/sudoers:

# Раскомментируйте, чтобы разрешить членам группы sudo не вводить пароль
# (Обратите внимание, что более поздние записи переопределяют это, поэтому вам может потребоваться переместить
# это дальше)
# %sudo ALL=NOPASSWD: ВСЕ

Возможно, вам понадобится что-то вроде:

myuser ALL=NOPASSWD: mount

Я не совсем уверен в точном синтаксисе, лучше погуглите.

РЕДАКТИРОВАТЬ:Если вы пытаетесь смонтировать сетевой диск, добавление записи в /etc/fstab, вероятно, не сработает, поскольку сетевые службы не загружены во время выполнения fstab.

Связанный контент