Должны ли скрипты, которые требуют sudo, потерпеть неудачу, если у них их нет, или использовать sudo и приглашение?

26

У меня есть скрипт, который дает мне детальный контроль над яркостью подсветки и требует sudoзапуска. Это по сути это:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | tee $backlight

и живет в ~/bin/backlight-adjust. Сценарию нужны sudoпривилегии, потому что tee $backlightон пишет в привилегированное местоположение. Так что он потерпит неудачу, если не будет работать с sudo.

У этого подхода есть проблема, потому что я не могу просто запустить sudo backlight-adjust, потому что ~/binего нет $PATHв sudoсреде, только в моей среде. Так что мне придется бежать sudo env "PATH=$PATH" backlight-adjustили что-то подобное.

В качестве альтернативы я мог бы написать это так:

backlight="/sys/class/backlight/acpi_video0/brightness"
echo $1 | sudo tee $backlight

и предложите мне пароль.

Второй подход работает лучше для меня, потому что я не должен помнить, чтобы напечатать sudo; это подскажет мне. И я могу сохранить свои $PATHнетронутыми. В целом это кажется более удобным, но есть ли причины, по которым я не должен делать это вторым способом?

(Я использую Xubuntu 14.04, а моя оболочка - GNU bash 4.2.45, если это имеет значение.)

Джон Феминелла
источник
Спасибо за исправление. Я использую модифицированный Debian (LMDE), и мой sudoфактически сохраняет мой $PATHпо умолчанию, поэтому у меня нет этой проблемы.
Terdon

Ответы:

27

Лично я бы использовал другой подход. Сделайте псевдоним для вашего скрипта. Добавьте эту строку в ваш ~/.bashrc(или эквивалент в других оболочках)

alias backlight-adjust='sudo ~/bin/backlight-adjust'

Таким образом, вам не нужно беспокоиться о том, чтобы не забыть запустить его, sudoи вам не нужно добавлять sudoскрипт в скрипт. Он будет полностью прозрачен для вас и просто спросит ваш пароль, когда вы попытаетесь запустить backlight-adjust.

Тердон
источник
Это кажется очень разумным подходом, который оказывает минимальное влияние на остальную часть системы. +1.
Джон Феминелла
@JohnFeminella С другой стороны, если вы захотите поделиться этим сценарием с кем-то еще, им также понадобится псевдоним. Лично я не вижу никакой причины не вставлять sudoв настоящий скрипт, тем более что это позволяет легко увидеть, какие элементы скрипта действительно требуют корневых разрешений.
Кайл Стрэнд
@KyleStrand нет, они не будут. Команда, вызываемая скриптом, просто будет жаловаться на отсутствие доступа.
Terdon
@terdon Я понимаю, что мог бы быть немного яснее, но, вероятно, вы знаете, что я имел в виду: получатель сценария столкнется с той же проблемой, с которой изначально столкнулся автор сценария, и как добросовестный автор сценария, автор должен также поделитесь своим личным решением этой конкретной проблемы использования.
Кайл Стрэнд
@KyleStrand - да, но проблем не было, единственная проблема, с которой столкнулся ОП, заключалась в том, что он не хотел «не забывать вводить sudo», кроме того, сценарий будет идеально переносимым. Моя точка зрения заключается в том, что псевдоним полностью необязателен и ничего не решает, он просто облегчает его использование.
Terdon
7

Я не могу понять, почему это может быть неправильно - хотя я обычно предпочитаю, чтобы команды не задавали мне вопросы, чтобы они могли быть написаны в сценариях. Вы можете настроить /etc/sudoersего sudoбез пароля.

Но ... почему бы не добавить

chgrp  one-of-your-groups-here /sys/class/backlight/acpi_video0/brightness     
chmod g+w /sys/class/backlight/acpi_video0/brightness 

по твоему /etc/rc.localи забыть про sudo?

(В Ubuntu, если вы можете использовать его, sudoвы входите в группу sudo , так что вы можете использовать его chgrp sudo /sys...и быть счастливым.)

Rmano
источник
3

В качестве альтернативы, вы можете добавить

Defaults        env_keep +="PATH"

в ваш /etc/sudoersфайл.

киска
источник
2

Вы указываете sudo backlight-Adjust, потому что ~ / bin отсутствует в $ PATH в среде sudo.

Так зачем зависеть от этого? Я думаю, что вы должны просто изменить эту строку, /home/user/bin/backlight-adjustи она будет работать.

Но мне бы очень хотелось, чтобы решение Тердона использовать псевдоним тоже. Или вы можете поместить свой скрипт в /usr/bin/и он будет доступен для каждого пользователя (включая root)

ExploWare
источник
Да, но это раздражает. В противном случае, какой смысл ставить его в моем $ PATH? Кроме того, мне нравится иметь его, ~/binпотому что тогда он находится в репозитории точечных файлов моего дома, поэтому он остается под контролем версий.
Джон Феминелла
@JohnFeminella, кстати, нет причин менять путь, просто используйте -Eфлаг, чтобы сохранить окружающую среду:sudo -E command
terdon
@terdon Это не работает в Debian; это переопределено по соображениям безопасности. Вы должны были бы передать переменные окружения явно, как я упоминал в моем вопросе ( sudo env "PATH=$PATH" ...).
Джон Феминелла
1

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

Повышенные привилегии должны быть выданы экономно, если вообще. Переключиться на более высокую привилегию сложно, лучше оставить это экспертам (т.е. sudo(1)).

vonbrand
источник
0

Лично я использую что-то подобное ${SUDO}в своих сценариях, чтобы вызывающий мог установить его при необходимости или ${SUDO:-sudo}использовать по умолчанию.

В вашем конкретном случае, я с принятым ответом.

mirabilos
источник
-1

Поместите скрипт (без sudo) в подходящее место для всего пользователя, например /bin, и затем сделайте следующее:

sudo chown root /bin/backlight-adjust
sudo chmod 4755 /bin/backlight-adjust

Это работает путем установки флага setuid, что означает, что он всегда будет запускаться как владелец файла. Для получения дополнительной информации, пожалуйста, прочитайте http://major.io/2007/02/13/chmod-and-the-mysterious-first-octet/ . Я на самом деле не очень много знаю о том, как это работает, я просто нашел, что это гуглится, основываясь на том, что я думал, что читал несколько лет назад.

AJMansfield
источник
1
Сценарии оболочки больше не могут быть настроены, слава богу ... Это очень злой ответ, вы знаете. Особенно в плане безопасности.
Мирабилось
@mirabilos Опасно только если включены флаги групповой или общей записи. Риск использования setuid заключается в том, что любой пользователь с правами на запись для файла может запускать все, что ему нравится, как если бы он был пользователем, и поэтому именно эти разрешения на запись должны быть защищены. 4755означает, что всегда выполняется как владелец, владелец может читать, писать и выполнять, группа может читать и выполнять, а пользователи могут читать и выполнять, что является стандартным уровнем разрешений для вещей, которые любой пользователь должен иметь право делать с правами root.
AJMansfield
@mirabilos И идея, что сценарии оболочки с setuid представляют больше уязвимостей, чем двоичные файлы с setuid, просто глупа; исполняемые файлы также не защищены от эксплойта ptrace, который является основным эксплойтом, использующим преимущества setuid.
AJMansfield
2
Все текущие Unix-подобные ОС запрещают сценарии setuid. Это просто факт. Спросите их о причинах самостоятельно, если вы мне не верите. Начните с OpenBSD.
Мирабилось