Come posso sudo un comando in uno script senza che venga richiesta una password?

101

Voglio accendere il mio sistema automaticamente ogni giorno. Quindi uso il codice seguente nel mio script Python, ma sudo mi chiede una password ogni volta:

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

Come posso eseguire questo script senza sudo chiedendo la password ogni volta?

    
posta Viswa 25.06.2012 - 15:30

5 risposte

138
  

Nota: qualsiasi metodo che implichi l'inserimento della password di accesso in testo normale, in un comando o in un file, non è sicuro e NON dovrebbe essere utilizzato!

Il modo corretto di farlo per impostare sudo tale che solo l'unico comando specifico di cui hai bisogno, cioè echo date... > rtc... , può eseguire SENZA avere bisogno del parola d'ordine.

Passaggio 1. Creare uno script di shell con il solo comando

  • Apri gedit (o il tuo editor preferito) e crea lo script, ad es. %codice%
  • Inserisci solo questa riga e salvala in, ad es. la tua home directory:
    echo date \'+%s\' -d \'+ 24 hours\' > /sys/class/rtc/rtc0/wakealarm
  • Esci dall'editor e, dal terminale, rendi eseguibile lo script e e modifica la proprietà in root , altrimenti un altro utente con accesso al tuo sistema potrebbe eventualmente modificarlo e esegui qualunque comando desideri come root senza bisogno della tua password:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh
    

Passaggio 2. Impostare sudo per consentire a pydatertc.sh di eseguire senza richiedere una password

  • Digita pydatertc.sh sul terminale per aprire il file di autorizzazioni sudo ( sudo visudo )
  • Intorno alla riga 25, vedrai questa riga: sudoers
  • Sotto quella riga , inserisci la seguente riga, dove %sudo ALL=(ALL:ALL) ALL è il tuo nome utente:
    username  ALL=(ALL) NOPASSWD: /home/username/pydatertc.sh
  • Esci dall'editor ( Ctrl + X se nano )

Passaggio 3. Modifica il tuo script python per chiamare username

  • Modifica la linea in:
    os.system('sudo /home/username/pydatertc.sh')

Ora lo script dovrebbe essere eseguito senza richiedere una password AND senza compromettere la sicurezza del tuo account, dei tuoi dati o del tuo sistema!

Alternativa solo per pydatertc.sh (non per uso generale!):

In solo questo caso specifico , poiché il file wakealarm controlla solo l'allarme di risveglio per il sistema ed è altrimenti innocuo, un'altra alternativa per evitare la password è di prenderne possesso file con /sys/class/rtc/rtc0/wakealarm (se sei l'unico utente che imposta l'allarme), o rendilo scrivibile in tutto il mondo con chown ; in tal caso, rimuovi semplicemente chmod +666 dalla tua chiamata Python, lasciando sudo intatto.

    
risposta data ish 25.06.2012 - 16:53
29
  

Avviso!

     

Mettere la tua password di accesso in testo semplice, in un comando o in un file, è estremamente non sicuro e può compromettere i tuoi dati privati ​​e il tuo sistema. altamente raccomandato non fare mai questo anche se pensi che il tuo sistema sia "personale" o in una "posizione sicura"!

Se lo script è solo per uso personale e lo hai collocato in un luogo sicuro e non hai paura che il tuo account venga rubato e tale, ecco una soluzione semplice:

echo LOGINPASSWD | sudo -S COMMAND HERE

dove LOGINPASSWD è la tua password di accesso (esempio: iloveponies) e COMANDO QUI è il tuo comando che viene dopo sudo, come sh -c "echo da .. ecc.

    
risposta data hytromo 25.06.2012 - 15:38
21

Se non ti dispiace che lo script venga eseguito in un momento specifico nell'ora (o durante il giorno), inseriscilo nella directory principale di root ( /root ) ed esegui lo script dal sistema crontab ( /etc/crontab ) come root. Quindi non dovrai compromettere la sicurezza.

Vedi link per come aggiungere lo script a crontab.

    
risposta data z7sg 25.06.2012 - 15:49
11

Un'altra interessante funzionalità di sudo che non è stata menzionata nelle eccellenti risposte sopra è la variabile 'timestamp_timeout'. È una variabile sudo che puoi aumentare per risparmiare sulla digitazione della password interattiva.

Esempio, in / etc / sudoers (o uno dei file inclusi da esso) puoi modificare l'impostazione predefinita:

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

Descrizione completa di "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.

Naturalmente, questo non può aiutare nel caso specifico di eseguire il comando da cron. Ma è una buona cosa essere a conoscenza.

    
risposta data arielf 29.06.2012 - 23:10
1
export MY_SUDO_PASS="user_password_here"

Per verificare se funziona, digita

echo $MY_SUDO_PASS
> user_password_here

Per eseguire "sudo apt-get update" e accettare la password dalle variabili di ambiente che abbiamo creato prima:

echo $MY_SUDO_PASS | sudo -S apt-get update

Esegui da python (ad esempio cambiando la proprietà della directory in modo ricorsivo in 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 password -S passa a prenderlo e passa la password a sudo

    
risposta data Jozsef Turi 15.03.2018 - 17:59

Leggi altre domande sui tag