Альтернативный способ запуска команды sudo при запуске
Я пытаюсь написать скрипт для моей системы Ubuntu, чтобы переходить в спящий режим всякий раз, когда оставшийся заряд батареи (скажем) составляет 5%. Этот скрипт будет запускаться при запуске.
Я могу получить аккумулятор, используя
upower -d |grep perc
Тогда я хочу использовать
sudo pm-hibernate
всякий раз, когда батарея достигает <= 5%. Но для этого требуется разрешение суперпользователя. И Я НЕ ХОЧУ ТИПОВАТЬ ПАРОЛЬ СНОВА И СНОВА ПОСЛЕ КАЖДОГО ВХОДА.
Один из способов - добавить следующую строку в /etc/sudoers
yourlogin ALL=(ALL) NOPASSWD: command_here
Но большинство людей рекомендуют против этого.
Другой способ - добавить собственный скрипт запуска в /etc/init.d
, Но я не уверен, что это безопасный выбор.
Кроме того, есть ли другая альтернатива, которая была бы лучше всего подходит для моих целей?
4 ответа
Проще, чем добавить скрипт в init.d
это написать конфигурацию Upstart. Я бы предпочел это прежде всего. Создать .conf
файл в /etc/init
(сказать /etc/init/sleep-on-suspend.conf
, содержащий:
description "Automatic suspend"
start on runlevel [2345]
stop on runlevel [016]
exec /path/to/script
Это будет автоматически начато при перезагрузке.
Вы даже можете интегрировать скрипт в этот файл. Вместо exec
линия, используйте:
script
while sleep 1; do
upower -d | awk -F'[ %]*' '/perc/ && ($3 < 5) { exit 1 }' || pm-hibernate
done
end script
Бежать sudo crontab -e -u root
и добавить строку @reboot /path/to/script
внизу файла, пользователь root автоматически запустит ваш скрипт как root при входе в систему. И дружеское напоминание, чтобы никто кроме вас и root не мог получить доступ к сценарию, иначе люди могут запускать любую команду от имени root.
Этот скрипт будет запускаться при запуске.
Если вы действительно это имеете в виду, значит, вы уже говорите о привилегиях суперпользователя.
Как выглядит остальная часть вашего сценария? Мы не можем судить о безопасности или отсутствии таковых по изолированным командам.
Один из вариантов - запускать его, скажем, каждые 5 минут root
"s crontab
, Если вы боитесь последствий для безопасности, вы можете создать отдельного пользователя с ограниченными правами, кроме как в управлении питанием.
Добавьте это в новый файл:
*/5 * * * * root /usr/local/sbin/hibernate-on-power-low
(где возможно root
может быть заменен выделенным пользователем, если хотите) и установить это в /etc/cron.d/hibernate-maybe
, Очевидно, что скрипт, который выполняет реальную работу, должен быть установлен в /usr/local/sbin/hibernate-on-power-low
и должным образом проверены на безопасность и эффективность (вероятно, использование прямого интерфейса ядра было бы более надежным и эффективным, чем grep
) и, очевидно, если вы уже работаете с соответствующими правами, вам не нужно sudo
бежать pm-hibernate
,
Другой альтернативой является использование sudo -S
(что тоже небезопасно).
-S
переключатель sudo
прочитает пароль от STDIN. Итак, вы можете использовать его как:
echo 'password' | sudo -S <command>