
Главный вопрос:
Есть ли способ полностью запустить один из моих скриптов, когда появляется рабочий стол 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 запустит программу от имени другого пользователя только в том случае, если выполнено одно из трех условий (касательно паролей):
- указана опция NOPASSWD
- пользователь ввел правильный целевой пароль
- пользователь ввел правильный исходный пароль
Поскольку для вариантов 2 и 3 требуется TTY (sudo не будет читать из конвейера), он не запустится, если не сможет его найти. Проверьте свой скрипт, если в какой-то момент вы запускаете скрипт удаленно с помощью ssh, так как возможно, что он не выделит TTY для неинтерактивной удаленной команды.
Цитата из:Здесь
решение4
Возможным решением будет добавить вашего пользователя и команду, которую он пытается вызвать, в /etc/sudoers с параметром NOPASSWD. Вырезано из /etc/sudoers:
# Раскомментируйте, чтобы разрешить членам группы sudo не вводить пароль # (Обратите внимание, что более поздние записи переопределяют это, поэтому вам может потребоваться переместить # это дальше) # %sudo ALL=NOPASSWD: ВСЕ
Возможно, вам понадобится что-то вроде:
myuser ALL=NOPASSWD: mount
Я не совсем уверен в точном синтаксисе, лучше погуглите.
РЕДАКТИРОВАТЬ:Если вы пытаетесь смонтировать сетевой диск, добавление записи в /etc/fstab, вероятно, не сработает, поскольку сетевые службы не загружены во время выполнения fstab.