Альтернативный способ запуска команды 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>
Другие вопросы по тегам