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

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

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

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

113
задан 13 June 2014 в 18:29

5 ответов

Vă rugăm să rețineți: Orice metodă care implică plasarea parolei de autentificare în text simplu , într-o comandă sau într-un fișier, este nesigur și NU trebuie utilizat!

Modul corect de a face acest lucru pentru a configura sudo astfel încât numai cel specific comanda de care aveți nevoie, adică data ecoului ...> rtc ... , este tot trebuia să ruleze FĂRĂ să ai nevoie de parolă.

Pasul 1. Creați un script shell doar cu acea comandă

  • Deschideți gedit (sau editorul dvs. preferat) și creați scriptul de ex. pydatertc.sh
  • Introduceți doar această linie și salvați-o în, de ex. directorul dvs. de acasă:
     data ecou \ '+% s \' -d \ '+ 24 ore \'> / sys / class / rtc / rtc0 / wakealarm 
  • Părăsiți editorul și de la terminal, faceți scriptul executabil și își schimbă calitatea de proprietar în root , altfel un alt utilizator cu acces la sistemul dvs. ar putea să îl editeze și să execute orice comenzi doresc ca root fără a avea nevoie de parolă:
     sudo chown root: root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
     

Pasul 2. Configurați sudo pentru a permite pydatertc.sh să se execute fără a necesita o parolă

  • Tastați sudo visudo la terminal pentru a deschide permisiunile sudo ( sudoers ) fișier
  • În jurul liniei 25, veți vedea această linie: % sudo ALL = (ALL: ALL) ALL
  • Sub acea linie , introduceți următoarea linie, unde nume de utilizator este numele dvs. de utilizator:
     nume de utilizator ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Ieșiți din editor ( Ctrl + X dacă nano )

Pasul 3. Modificați scriptul python pentru a apela pydatertc.sh

  • Schimbați linia în:
     os.system ('sudo /home/username/pydatertc.sh')

Acum scriptul dvs. ar trebui să ruleze fără a necesita o parolă ȘI fără a compromite securitatea contului dvs., a datelor dvs. sau a system!


Alternativă numai pentru wakealarm (nu pentru uz general!):

În numai în acest caz specific , deoarece / sys / class / rtc / fișierul rtc0 / wakealarm controlează doar alarma de trezire pentru sistem și este altfel inofensiv, o altă alternativă pentru a evita parola este fie să dețineți fișierul respectiv cu chown (dacă sunteți singurul utilizatorul care setează alarma) sau faceți-o scriibilă în toată lumea cu chmod +666 ; în acest caz, pur și simplu eliminați sudo din apelul dvs. Python, lăsând sh -c "...." intact.

156
ответ дан 13 June 2014 в 18:29

Dacă nu te deranjează ca scriptul să ruleze la o anumită oră din oră (sau în timpul zilei), puneți-l în directorul principal al rădăcinii ( / root ) și rulați scriptul din sistemul crontab ( / etc / crontab ) ca root. Apoi ați câștigat Nu trebuie să vă compromiteți securitatea.

Consultați https://help.ubuntu.com/community/CronHowto pentru a adăuga scriptul la crontab.

21
ответ дан 13 June 2014 в 18:29

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

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

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

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

timestamp_timeout

  Количество минут, которое может пройти до того, как sudo запросит
  снова пароль.  По умолчанию 5, установите 0, чтобы всегда
  запросить пароль.
 

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

11
ответ дан 13 June 2014 в 18:29

Atenție!

Introducerea parolei de conectare în text simplu, într-o comandă sau fișier, este extrem de nesigură și poate compromite datele dvs. private și sistemul dvs. Este foarte recomandat să nu faceți acest lucru niciodată, chiar dacă credeți că sistemul dvs. este „personal” sau într-o „locație sigură”!

Dacă scriptul este doar pentru uz personal și l-ați plasat într-un un loc sigur și nu vă este frică de furtul contului dvs. și așa ceva,atunci iată o soluție simplă:

echo LOGINPASSWD | sudo -S COMMAND HERE

unde LOGINPASSWD este parola dvs. de conectare (exemplu: iloveponies) și COMANDĂ AICI este comanda ta care vine după sudo, cum ar fi sh -c "echo da .. etc

30
ответ дан 13 June 2014 в 18:29
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 получить пароль -S переключатель, перехватывающий его и передающий пароль sudo

1
ответ дан 13 June 2014 в 18:29

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

Похожие вопросы: