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

2

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

Есть ли способ, которым я могу выполнить «полностью» один из моих сценариев, когда рабочий стол 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.

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

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

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

sudo: no tty present and no askpass program specified
Undefined
источник
какой дистрибутив вы используете? какой рабочий стол? Вы могли бы смонтировать диск при запуске системы (например, из / etc / fstab)?
quack quixote
Я использую Ubuntu 9.10 с GNOME. Да, я могу смонтировать диск с помощью / etc / fstab, но это сделает этот раздел доступным для всех пользователей, которых я не хочу. Я хочу, чтобы только root имел доступ к этому разделу. Есть мысли по этому поводу?
Undefined
@ Usman смонтируйте его с нужными разрешениями.
Oliver Friedrich
Если я монтирую / mnt таким образом, чтобы все права были доступны только пользователю root, моя программа запуска не сможет получить доступ к данным в / mnt.
Undefined
гораздо лучший вопрос @Usman
quack quixote

Ответы:

2

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

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

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

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

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

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

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

edk
источник
Извините, эдК, но, кажется, я не понял вашего первого предложения. Я установил suid моей программы с помощью команды chmod + s. Теперь, что будет делать код C?
Undefined
1
Как тот, который я дал. Вы можете играть с этим примером и режимами 4755 & amp; 6755: codepad.org/zkCULq3q
edk
Кликнул «это отличный комментарий» по ошибке. : P Хорошо, вот что я понимаю. Поправь меня, если я ошибаюсь. Вы хотите, чтобы я написал программу на C, которая установит setuid (0), а затем запустит мой скрипт через систему ("/ home / namsu / Desktop / my_copying_script") и, наконец, я установлю исполняемый файл этого кода C для запуска при запуске. Правильно? :)
Undefined
Я думал, что это было сказано довольно ясно в моем ответе.
edk
1

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

edk
источник
Извините, но это не решит проблему.
Undefined
тогда я не могу думать ни о чем ином, кроме создания сценария-демона, который будет отслеживать порождение процессов, связанных с X, ИЛИ вы можете использовать suid-двоичный файл, который будет проверять, кто является вызывающим, и затем делать то, что вы хотите, но я действительно не вижу причина для этого, если вы хотите, чтобы диск был доступен только пользователю root. если вы просто хотите, чтобы при входе в систему выполнялся скрипт с правами root, то suid-binary - это самый простой (но опасный!) способ сделать это. На самом деле, это скорее взлом, чем реальное решение.
edk
0

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

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

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

Цитируется из: Вот

S.Hoekstra
источник
Я не запускаю свой скрипт с использованием ssh.
Undefined
@Usman: ssh - не единственное место, где Судо будет жаловаться на то, что его побуждают не взаимодействовать. он также будет жаловаться при запуске из сценария запуска, так как к процессу запуска не подключен TTY.
quack quixote
И присоединение TTY к моему сценарию запуска не возможно, верно?
Undefined
0

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

sudo chown -R root:root /mnt
sudo chmod -R 770 /mnt
Mark
источник
Я смонтировал раздел, добавив запись в / etc / fstab и установил разрешения, как вы указали, но это не сработало, потому что теперь мой загрузочный скрипт не может получить доступ к данным в / mnt, когда я захожу как обычный пользователь (не root). Мой обычный пользователь не получает доступ к / mnt, что очень хорошо для меня, но моя программа должна получить доступ к / mnt. Я все еще застрял. :(
Undefined
В своем комментарии вы сказали: «Я хочу, чтобы только root имел доступ к этому разделу». Если вы хотите, чтобы другие имели доступ только для чтения, замените 770 на 774 в команде chmod.
Mark
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.

Ivan Petrushev
источник