Как выполнить команду в сценарии без запроса пароля?
Я хочу, чтобы моя система автоматически включалась каждый день. Поэтому я использую приведенный ниже код в моем скрипте 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