Buon pomeriggio a tutti.
Ho creato uno script .sh con cui lancio un programma a ripetizione perché lavori su vari file contenuti in diverse cartelle. Mi piacerebbe che, eseguita l'ultima volta il programma, il computer si spegnesse.

Ho provato in due modi:

  1. scrivendo alla fine del file:

    # shutdown -h now
    
  2. scrivendo alla fine del file:

    # if -e <nomeultimofilecreato> then shutdown -h now;
    fi
    


Per poter eseguire shutdown devo lanciare lo script con sudo. Tuttavia, nel caso 1. ricevo una serie di errori riguardanti le parti precedenti dello script (quelle che lanciano il programma con cui lavoro), quindi il computer si spegne. Il risultato quindi è che appena lancio lo script il computer si arresta. Nel caso 2. invece ricevo vari errori. Ho anche provato a modificare la sintassi in vari modi spostando o eliminando il ; o il fi ma niente.
In generale il problema è che se lancio il mio script.sh con sudo lo script non funziona. Se, dopo aver lanciato sudo e inserito la password, lancio lo script normalmente nello stesso terminal, lo script funziona ma non il comando shutdown.

Qual'è il modo corretto di inserire il comando shutdown al termine di uno script che non richiede sudo per essere eseguito? Grazie.

chiesto 04 Mar '14, 15:44

H-Award32's gravatar image

H-Award32
65449

modificato 04 Mar '14, 18:10

enzotib's gravatar image

enzotib ♦♦
14.0k112186


L'alternativa è quella di indicare nel file /etc/sudoers che il comando shutdown può essere eseguito senza password.

ATTENZIONE: modificare in modo non corretto il file sudoers può rendere inaccessibili i comandi amministrativi. È fortemente consigliato modificare tale file con il comando seguente:

sudo visudo

che prima di rendere permanenti le modifiche effettua un controllo sintattico del file risultante. L'editor utilizzato da tale comando è nano, con il quale si salva con Ctrl-O e si termina con Ctrl-X.

La modifica da apportare al file consiste nell'aggiungere alla fine una riga con il seguente contenuto:

%sudo ALL = NOPASSWD: /sbin/shutdown

Dopo aver salvato potrai eseguire uno shutdown con il comando

sudo shutdown -h now

senza che ti venga chiesta la password, anche all'interno dello script.

Ricapitolando, lo script lo lanci senza sudo e dentro lo script ci metti il comando shutdown con sudo, che verrà eseguito senza richiesta della password.

coll. permanente

ha risposto 05 Mar '14, 16:02

enzotib's gravatar image

enzotib ♦♦
14.0k112186

Alla fine ho fatto così, solo che avevo trovato da qualche parte di scrivere NOPASSWD: ALL. Ma modificherò il file come consigliato, per limitare allo shutdown l'esecuzione senza password.

(06 Mar '14, 11:02) H-Award32 H-Award32's gravatar image

Fallo il prima possibile.

Mettere NOPASSWD: ALL su una macchina magari connessa a internet è praticamente un suicidio.

La sicurezza di Linux si basa sul fatto che quasi nulla può essere fatto senza una password (tra cui accedere ai file personali di un altro utente).
Mettendo quella riga, qualsiasi comando può essere eseguito come superutente senza che ne venga data notifica all'utente né venga richiesta la password.

(06 Mar '14, 11:41) dadexix86 ♦♦ dadexix86's gravatar image

Oppure potresti usare dbus-send, che non necessita di privilegi per spegnere il sistema e non corri il rischio di rovinare qualcosa modificando file pericolosi come sudoers.

In particolare per spegnere dai

dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop

tutto su una riga :)

coll. permanente

ha risposto 05 Mar '14, 18:13

dadexix86's gravatar image

dadexix86 ♦♦
16.9k816161

modificato 05 Mar '14, 18:23

Per eseguire un comando con sudo senza che venga richiesta la password è necessario modificare opportunamente il file /etc/sudoers.
In questo caso non è necessario. Ti suggerisco di dividere le azioni in due script,

  1. script1 corrisponde allo script da lanciare con sudo, il cui contenuto è

    #!/bin/sh
    
    sudo -u $SUDO_USER ./script2
    shutdown -h now
    
  2. script2 corrisponde allo script con i comandi specifici dell'utente che non richiede privilegi di root

Come vedi la soluzione sfrutta due caratteristiche di sudo:

  1. da dentro sudo puoi sapere lo username dell'utente che ha invocato sudo tramite la variabile d'ambiente SUDO_USER
  2. anche da dentro sudo puoi agire come utente normale sfruttando la sintassi

    sudo -u username comando
    

    che non richiede la password, dato che sei già root in quel momento.

coll. permanente

ha risposto 04 Mar '14, 18:17

enzotib's gravatar image

enzotib ♦♦
14.0k112186

modificato 04 Mar '14, 18:18

Niente, continuo a ricevere errori: ./sienax.sh: 93: ./sienax.sh: sienax: not found ./sienax.sh: 95: ./sienax.sh: sienax: not found e così via fino a 109.

sienax.sh è il nome dello script2 e sienax il nome del programma che lancio. Non ho capito bene che vuol dire, forse con questa modalità non vengono lette le variabili di ambiente con le impostazioni del programma e i vari percorsi che ho impostato in .bashrc?

(04 Mar '14, 22:53) H-Award32 H-Award32's gravatar image

@H-Award32: beh, è ovvia che non vengono lette, se domani ho tempo ti scrivo la soluzione per sudoers, che forse alla fine è più semplice

(04 Mar '14, 22:58) enzotib ♦♦ enzotib's gravatar image

Questi sono i medesimi errori che ricevo se provo a inserire il comando shutdown al termine dello script e faccio partire tutto lo script con sudo, ma anche se elimino il comando shutdown è lo stesso: in pratica c'è qualche motivo per cui il mio script non funziona se lanciato con sudo.

(04 Mar '14, 22:58) H-Award32 H-Award32's gravatar image

in ogni caso la sintassi del comando 2 è sbagliata. dovrebbe essere

if [ -e <nomeultimofilecreato> ]; then shutdown -h now; fi
coll. permanente

ha risposto 04 Mar '14, 22:12

f-muriana's gravatar image

f-muriana
30113

La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×48
×16
×16

domanda posta: 04 Mar '14, 15:44

domanda visualizzata: 3,878 volte

ultimo aggiornamento: 06 Mar '14, 11:41

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.