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

107

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

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

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

Вишва
источник
4
Вы должны заглянуть в руководство по материнской плате или BIOS, чтобы увидеть, поддерживает ли оно такое поведение. Я знаю, что это уклоняется от вопроса! =] Но это может быть достаточным решением.
Алекс Хирзель

Ответы:

149

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

Правильный способ сделать это для настройки так 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в терминале, чтобы открыть sudoersфайл sudo permissions ( )
  • Вокруг строки 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 "...."без изменений.

иш
источник
1
Круто, это правильный способ сделать это.
roadmr
1
Такой подробный, полезный ответ и как именно это должно быть сделано.
ArtOfCode
@RobertRosati, большое спасибо за предложенное редактирование - я не должен был забывать об этом в первую очередь!
Иш
1
@ m-ric Вы читали команду над этими строками? «В противном случае другой пользователь, имеющий доступ к вашей системе, мог бы отредактировать ее и выполнить любые команды, которые он хочет получить от имени root, не требуя вашего пароля»
Тобиас Кинцлер,
2
Я понимаю, что этот ответ старый, но здесь все еще есть проблема: если файл находится в / home / username , тогда система может быть взломана, если этот каталог доступен для записи злонамеренному пользователю (или имени пользователя без полномочий root, который скомпрометировано) . Они могут удалить или переименовать файл, поставить еще один скрипт на своем месте, и работает этот скрипт через sudo- без пароля. Следовательно, гораздо безопаснее поместить скрипт в каталог, который может изменить только root, например: / usr / sbin или / root . В противном случае это LGTM.
NVRAM
30

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

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

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

echo LOGINPASSWD | sudo -S COMMAND HERE

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

hytromo
источник
13
@Viswa, обратите внимание, что очень просто раскрыть пароль в виде обычного текста. Настоятельно советуем не делать этого
Анвар
3
-1 Если это кажется хорошей идеей, вам лучше установить пароль для своей учетной записи root и использовать решение z7sg; это так же просто, и не создает этой очень опасной проблемы безопасности.
Брайс
4
Хах! У меня было 6 голосов "за" и "4" за ответ :) Но почему, ребята, я не понял, что такое «личное использование», «безопасное место» и т.д.? Нет проблем с безопасностью, если вы не выдадите этот файл и у вас не будет запущен ssh-сервер! Где вы видите проблему безопасности при условии, что скрипт предназначен для личного использования и в безопасном месте?
Hytromo
5
Понятно, что это Дорога на темную сторону, и она не нужна для метода sudo.
Флойд
4
Хорошо, просто скажите мне, даже если хакер вошел как простой пользователь в вашу учетную запись, как, черт возьми, он найдет скрипт с вашим паролем в / usr / share / help / lv / ubuntu-help ??
Hytromo
21

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

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

z7sg
источник
4
Возможно, вы захотите использовать, anacronесли это настольный компьютер / ноутбук, который не работает 24x7
balki
Это полезный ответ, например, если вы пишете скрипт для проверки обновлений, что-то делаете с этой информацией и отправляете по электронной почте администратору информацию о необходимых обновлениях. Лично многие из моих сценариев используются для автоматизации серверов, поэтому я бы хотел использовать sudo crontab -e. +1
Раб
11

Еще одна приятная особенность 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. Но это хорошо, что нужно знать.

arielf
источник
0
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

jturi
источник
Я не уверен, что это добавляет к существующим ответам наиболее актуальную поддержку BIOS после тревоги ...
Старейшина Geek