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

100

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

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

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

    
задан Viswa 25.06.2012 в 15:30
источник

4 ответа

133
  

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

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

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

  • Откройте gedit (или ваш любимый редактор) и создайте скрипт, например. %код%
  • Вставьте только эту строку и сохраните ее, например. ваш домашний каталог:
    echo date \'+%s\' -d \'+ 24 hours\' > /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 , не требуя пароля

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

Шаг 3. Измените скрипт python для вызова username

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

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

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

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

    
ответ дан izx 25.06.2012 в 16:53
источник
28
  

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

     

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

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

echo LOGINPASSWD | sudo -S COMMAND HERE

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

    
ответ дан hakermania 25.06.2012 в 15:38
источник
21

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

См. Ссылка о том, как добавить скрипт в crontab.

    
ответ дан z7sg 25.06.2012 в 15:49
источник
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 29.06.2012 в 23:10
источник

Ознакомьтесь с другими вопросами по меткам