2

Основной вопрос:

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

Что делает скрипт?

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

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

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

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

sudo ./my_copying_script

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

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

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

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

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

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

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

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

sudo: no tty present and no askpass program specified

5 ответов5

2

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

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

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

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

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

Хороший способ

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

1

Установите правильные права доступа к подключенному пути, и все готово.

0

Добавьте запись в /etc /fstab, используйте chown и chmod, чтобы изменить разрешения, чтобы предоставить только root-доступ к смонтированному разделу.

sudo chown -R root:root /mnt
sudo chmod -R 770 /mnt
0

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

# Uncomment to allow members of group sudo to not need a password
# (Note that later entries override this, so you might need to move
# it further down)
# %sudo ALL=NOPASSWD: ALL

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

myuser ALL=NOPASSWD: mount

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

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

0

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

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

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

Цитируется из: Здесь

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .