Come sudo un comando in uno script senza che mi venga chiesta una password?


107

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

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

Come posso eseguire questo script senza sudochiedere la password ogni volta?


4
Dovresti consultare il manuale della scheda madre o il BIOS per vedere se supporta questo comportamento. So che schiva la domanda! =] Ma potrebbe essere una soluzione sufficiente.
Alex Hirzel,

Risposte:


149

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

Il modo corretto di farlo per configurare in modo sudotale che solo un comando specifico di cui hai bisogno, vale a dire echo date... > rtc..., sia autorizzato a eseguire SENZA la password.

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

  • Apri gedit(o il tuo editor preferito) e crea lo script, ad espydatertc.sh
  • Inserisci solo questa riga e salvala in, ad esempio la tua home directory:
    data eco \ '+% s \' -d \ '+ 24 ore \'> / sys / class / rtc / rtc0 / wakealarm
  • Esci dall'editor e, dal terminale, rendi eseguibile lo script e cambia la sua proprietà in root , altrimenti un altro utente con accesso al tuo sistema potrebbe modificarlo ed eseguire qualsiasi comando desideri come root senza la tua password:
    sudo chown root:root /home/username/pydatertc.sh
    sudo chmod 700 /home/username/pydatertc.sh

Passaggio 2. Configurare sudo per consentire pydatertc.shl'esecuzione senza richiedere una password

  • Digitare sudo visudosul terminale per aprire il file sudo autorizzazioni ( sudoers)
  • Intorno alla linea 25, vedrai questa linea: %sudo ALL=(ALL:ALL) ALL
  • Sotto quella riga , inserisci la seguente riga, dove si usernametrova il tuo nome utente:
    nome utente ALL = (ALL) NOPASSWD: /home/username/pydatertc.sh
  • Esci dall'editor ( Ctrl+ Xse nano )

Passaggio 3. Modifica lo script Python da chiamare pydatertc.sh

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

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


Alternativa solo per wakealarm(non per uso generale!):

Solo in questo caso specifico , poiché il /sys/class/rtc/rtc0/wakealarmfile controlla solo l'allarme di sveglia per il sistema ed è altrimenti innocuo, un'altra alternativa per evitare la password è assumere la proprietà di quel file con chown(se sei l'unico utente che imposta l'allarme) o renderlo scrivibile in tutto il mondo con chmod +666; in tal caso, è sufficiente rimuovere il sudodalla tua chiamata Python, lasciando sh -c "...."intatto.


1
Fantastico, questo è il modo corretto di farlo.
Roadmr

1
Una risposta così ben dettagliata, utile ed esattamente come dovrebbe essere fatta.
ArtOfCode

@RobertRosati, molte grazie per la modifica suggerita - non avrei dovuto dimenticarmene in primo luogo!
Ish,

1
@ m-ric Hai letto il comando sopra queste righe? "altrimenti un altro utente con accesso al tuo sistema potrebbe modificarlo ed eseguire qualsiasi comando desideri come root senza la tua password"
Tobias Kienzler,

2
Mi rendo conto che questa risposta è vecchia, ma qui c'è ancora un problema: se il file si trova in / home / nome utente , il sistema può essere compromesso se tale directory è scrivibile da un utente malintenzionato (o un accesso non root che è compromesso) . Potevano rimuovere o rinominare il file, inserire un altro script al suo posto, e l'esecuzione che lo script via sudo- senza una password. Quindi, è molto più sicuro mettere lo script in una directory che solo root può modificare, ad esempio: / usr / sbin o / root . Altrimenti, è LGTM.
NVRAM

30

Avvertimento!

Inserire la password di accesso in testo semplice, in un comando o in un file, è estremamente insicuro e può compromettere i tuoi dati privati ​​e il tuo sistema. Si consiglia vivamente di non farlo mai anche se si ritiene che il proprio sistema sia "personale" o in un "luogo sicuro"!

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

echo LOGINPASSWD | sudo -S COMMAND HERE

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


13
@Viswa, tieni presente che è molto pericoloso rivelare la password in chiaro. Si consiglia vivamente di non farlo
Anwar,

3
-1 Se questa sembra una buona idea, saresti molto meglio impostare una password sul tuo account di root e utilizzare la soluzione di z7sg; è altrettanto facile e non crea questo problema di sicurezza molto pericoloso.
Bryce,

4
Hah! Avevo 6 voti positivi e 4 voti negativi sulla mia risposta :) Ma perché ragazzi, non ero chiaro "Uso personale", "luogo sicuro" ecc.? Non c'è un problema di sicurezza se non dai questo file e non hai un server SSH in esecuzione! Dove vedi il problema di sicurezza a condizione che lo script sia per uso personale e in un posto sicuro?
hytromo,

5
Sottovalutato, questa è la strada verso il lato oscuro e non è necessaria con il metodo sudo.
Floyd,

4
Ok, dimmelo, anche se l'hacker ha effettuato l'accesso come semplice utente al tuo account, come diamine troverà lo script con la tua password in / usr / share / help / lv / ubuntu-help ??
hytromo,

21

Se non ti dispiace lo script in esecuzione a un'ora specifica (o durante il giorno), inseriscilo nella home directory di root ( /root) ed esegui lo script dal sistema crontab ( /etc/crontab) come root. Quindi non dovrai compromettere la tua sicurezza.

Vedi https://help.ubuntu.com/community/CronHowto per come aggiungere lo script al crontab.


4
Probabilmente potresti voler usare anacronse si tratta di un desktop / laptop che non funziona 24x7
balki

Questa è una risposta utile, ad esempio se si sta scrivendo lo script per verificare la presenza di aggiornamenti, fare qualcosa con tali informazioni e inviare via e-mail all'amministratore gli aggiornamenti necessari. Personalmente, molti dei miei script sono usati per l'automazione dei server, quindi usare semplicemente sudo crontab -e è ciò che tendo a fare. +1
Rab,

11

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

Esempio, in / etc / sudoers (o in uno dei file inclusi da esso) è possibile modificare il valore predefinito:

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

Descrizione completa da '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ò essere d'aiuto nel caso specifico dell'esecuzione del comando da cron. Ma è una buona cosa essere consapevoli.


0
export MY_SUDO_PASS="user_password_here"

Per verificare se è di tipo funzionante:

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 (esempio cambiando ricorsivamente la proprietà della directory 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 ottieni la password -S cambia catturandola e passando la password su sudo


Non sono sicuro di ciò che si aggiunge alle risposte esistenti, il più recente supporto BIOS risveglia su allarme ...
Elder Geek
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.