Как выполнить команду в сценарии без запроса пароля?

Я хочу, чтобы моя система автоматически включалась каждый день. Поэтому я использую приведенный ниже код в моем скрипте Python, но sudo спрашивает у меня пароль каждый раз:

os.system('sudo sh -c "echo date \'+%s\' -d \'+ \
       24 hours\' > /sys/class/rtc/rtc0/wakealarm"')

Как я могу запустить этот скрипт без sudo спрашивать пароль каждый раз?

5 ответов

Обратите внимание: любой метод, который включает в себя ввод пароля для входа в систему в виде простого текста, в команде или в файле, небезопасен и не должен использоваться!

Правильный способ сделать это, чтобы настроить sudo такой, что нужна только одна конкретная команда, т.е. echo date... > rtc..., разрешено запускать БЕЗ пароля.

Шаг 1. Создайте сценарий оболочки только с этой командой

  • Открыть gedit (или ваш любимый редактор) и создайте скрипт, например pydatertc.sh
  • Вставьте только эту строку и сохраните ее, например, в свой домашний каталог:
    дата эха \'+%s\' -d \'+ 24 часа \' > /sys/class/rtc/rtc0/wakealarm
  • Выйдите из редактора и из терминала сделайте сценарий исполняемым и измените его владельца на root, в противном случае другой пользователь, имеющий доступ к вашей системе, может отредактировать его и выполнить любые команды, которые он хочет получить с правами root, без ввода пароля:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

Шаг 2. Настройте sudo для разрешения pydatertc.sh выполнить без пароля

  • Тип sudo visudo на терминале, чтобы открыть права sudo (sudoers) файл
  • Вокруг строки 25 вы увидите эту строку: %sudo ALL=(ALL:ALL) ALL
  • Ниже этой строки вставьте следующую строку, где username ваше имя пользователя:
    имя пользователя ALL=(ALL) NOPASSWD: /home/username/pydatertc.sh
  • Выйдите из редактора (Ctrl+X, если nano)

Шаг 3. Измените ваш скрипт на Python для вызова pydatertc.sh

  • Измените строку на:
    os.system ('sudo /home/username/pydatertc.sh')

Теперь ваш скрипт должен работать без пароля и без ущерба для безопасности вашей учетной записи, ваших данных или вашей системы!


Альтернатива только для wakealarm (не для общего пользования!):

Только в этом конкретном случае, так как /sys/class/rtc/rtc0/wakealarm Файл управляет только сигналом тревоги для системы и в остальном безвреден, другой альтернативой, позволяющей избежать использования пароля, является либо переход в собственность этого файла с chown (если вы единственный пользователь, устанавливающий будильник), или сделайте его доступным для записи с помощью chmod +666; в этом случае просто удалите sudo от вашего вызова Python, оставив sh -c "...." неповрежденными.

Предупреждение!

Ввод пароля для входа в систему в виде простого текста, в команде или файле, крайне небезопасно и может поставить под угрозу ваши личные данные и вашу систему. Настоятельно рекомендуется никогда этого не делать, даже если вы считаете, что ваша система "персональная" или находится в "безопасном месте"!

Если скрипт предназначен только для личного использования, и вы поместили его в безопасное место, и вы не боитесь, что ваш аккаунт будет украден и тому подобное, вот простое решение:

echo LOGINPASSWD | sudo -S COMMAND HERE

где LOGINPASSWD - ваш пароль для входа в систему (пример: iloveponies), а COMMAND HERE - ваша команда, которая следует за sudo, например sh -c "echo da.. etc

Если вы не возражаете против запуска сценария в определенное время в час (или в течение дня), поместите его в домашний каталог пользователя root (/root) и запустить скрипт из системного crontab (/etc/crontab) как root. Тогда вам не придется ставить под угрозу вашу безопасность.

См. https://help.ubuntu.com/community/CronHowto чтобы узнать, как добавить скрипт в crontab.

Еще одна приятная особенность sudo, которая не была упомянута в превосходных ответах выше - это переменная timestamp_timeout. Это переменная sudo, которую вы можете увеличить, чтобы сэкономить на вводе интерактивного пароля.

Например, в /etc/sudoers (или в одном из файлов, включенных в него) вы можете изменить значение по умолчанию:

# only require a password once every 60 minutes
Defaults timestamp_timeout=60

Полное описание от 'man sudoers':

timestamp_timeout

        Number of minutes that can elapse before sudo will ask for
        a passwd again.  The default is 5, set this to 0 to always
        prompt for a password.

Конечно, это не может помочь в конкретном случае запуска команды из cron. Но это хорошо, что нужно знать.

export MY_SUDO_PASS="user_password_here"

Чтобы проверить, работает ли он, введите:

echo $MY_SUDO_PASS
> user_password_here

Чтобы запустить "sudo apt-get update" и принять пароль от переменных среды, которые мы создали ранее:

echo $MY_SUDO_PASS | sudo -S apt-get update

Запуск из python (пример рекурсивного изменения владельца каталога на username_here):

python
>> import subprocess
>> subprocess.call('echo $MY_SUDO_PASS | sudo -S chown -R username_here /home/username_here/folder_to_change_ownership_recursivley', shell=True)

echo $ MY_SUDO_PASS get's password -S switch перехватывает его и передает пароль в sudo

Другие вопросы по тегам