Newsgroup: it.comp.os.linux.iniziare
Titolo: SU in uno script di shell

Avrei bisogno di eseguire uno script tipo
#!/bin/bash
if grep -q QUALCOSA file.txt
    then halt
fi
il problema è quello di eseguire il "su" all'interno dello script (halt deve
essere lanciato come root)
Visto che su apre una nuova shell e non è possibile ridirezionare l'ouput nè
l'input, come posso fare?
come posso usare expect? è disponibile su tutte le distribuzioni di linux?
(non ho il pc qui, c'è installata una "linuxespresso", derivata di debian)
devo fare qualcosa tipo
#!/bin/bash
if grep -q QUALCOSA file.txt
    then
        expect
        spawn su
        expect "Password: "
        send "password\r"
        send halt
fi
? Ci sono altre soluzioni (anche dare la possibilità di eseguire halt non da
root)?
Ludovico

 l'input, come posso fare?
Non so se va bene per le tue esigenze, ma potresti semplicemente usare
sudo per lanciare halt nello script.
Ciao.
-- 
Lucio.
"Tutto quello che possiamo fare è sperare per il meglio, aspettarci 
il peggio e accontentarci di una via di mezzo"

 essere lanciato come root)
Non e' necessario che sia lanciato come root, basta abilitare il
suid bit sull'eseguibile, ma come misura migliore puoi usare sudo
per eseguirlo.
Davide
-- 
| If we added up all of the 2 cents that Slashdot readers gave, I wonder
| how much sense vs. cents we'd have.      -- From a Slashdot.org post 
| 
| 

 per eseguirlo.
Soluzione + facile e abbastanza sicura: crea un piccolo script che faccia
partire halt (occhio: full path e IFS resettato). Dai a questo script
owner = root e suid bit acceso. Usa questo script nel tuo script.
Altrimenti concordo con sudo.
Ciao,
-- 
       Roberto Divia`             Love at first sight is one of the greatest
       =============             labour-saving devices the world has ever seen.
Mailbox: C02110                 CERN-European Organization for Nuclear Research
E-mail: 
Robert...@cern.ch
           CH-1211 GENEVE 23, Switzerland

 Altrimenti concordo con sudo.
sudo non è presente nel sistema (porc..)
expect neanche
ho provato a copiare (giusto per evitare di toccare file funzionanti) halt
in un'altra cartella (/usr/local/bin), dargli il SUID e SGID, owner (mi
pare) root. Devo ricontrollare l'owner, cmq lanciandolo mi diceva "devi
essere root" (in inglese).
Non è che controlla l'utente corrente come fa bash? Oppure ho sicuramente
sbagliato l'utente?
Ludovico

 sbagliato l'utente?
Mi rispondo da solo: avevo sbagliato a dare l'utente, funziona.


Occhio che copiando sudo su /usr/local/bin hai creato tre problemi:
1) un possibile problema di sicurezza con un tool di sistema non al posto giusto
2) devi assicurare che halt sia su /usr/local/bin su tutti i sistemi su cui
   userai il tuo SW, incluso il tuo sistema se lo updati/cambi
3) se /usr/bin/halt cambia devi cambiare anche /usr/local/bin/halt
Anche usando /usr/bin/halt con lo suid settato hai creato dei possibili
problemi di sicurezza. Inoltre dovrai ricordarti di rimettere il bit
tutte le volte che /usr/bin/halt verra` cambiato (upgrade, re-installazioni,
nuovi sistemi).
Con lo script suid o con sudo non avresti questi problemi, o almeno li avresti
ridotti al minimo...
Per il lato sicurezza, esistono altre soluzioni piu' convolute ma piu' sicure.


 Avrei bisogno di eseguire uno script tipo
$ su 
# crontab -e 
 * * * * * /home/user/bin/pwoff
cosi' lo esegue ogni minuto con privilegi di root come vuoi tu 
#!/bin/bash
#io sono /home/user/bin/pwoff
DIR=/home/user/
#nome del file di battaglia di tuo fratello ;-)
FILENAME=file.txt 
FILE=$DIR$FILENAME
SWAP="$DIR.$FILENAME.swp"
if /bin/grep -q "STOPSTOP" $FILE ;then
        killall emacs
        #rm -f $SWAP #con vi
#ripulisce il file che senno' al prox riavvio s'incanta
        cat $FILE |sed 's/STOPSTOP//g' >$FILE
#copia di sicurezza
        cp -f $FILE /floppy
        halt
fi
#ok sara' per un'altra volta !
-- 
Il maresciallo dei carabinieri: "Appuntato, vieni dentro che piove!".
L'appuntato: "Grazie, maresciallo, ma anche qui fuori!".
		-- Da it.hobby.umorismo

 cosi' lo esegue ogni minuto con privilegi di root come vuoi tu
L'avevo fatto e per prova avevo lanciato uno script che controllava il file
e scriveva "OK" (echo OK) se nel file c'era scritto STOPSTOP, ridirezionando
il tutto su un file di log.
* * *[tab]* * * root /percorso/script >> /percorso/filedilog
nota: questo formato con il tab e il nome utente è quello che avevo nelle
righe già esistenti (è una derivata di debian, mi pare sia diverso)
Tuttavia nel file di log non compariva nulla, per cui avevo lasciato perdere
e risolto il tutto con il SUID sulla copia di halt (che si chiama "stop")
dove sbagliavo?
Ludovico

 ridotti al minimo...
sudo però non c'era nel sistema!
forse riproverò con lo script
Ludovico

 * * *[tab]* * * root /percorso/script >> /percorso/filedilog
questa scrittura col nome dell'utente che esegue , io la trovo in
/etc/crontab .
Se usi il cron di Paul Vixie (ce ne sono altri ?) dovresti usare la
mia col "crontab -e" da utente .
Poi volevo avvertirti che lo script che ho postato su e' una schifezza ;-) , perche' il
kill brutale su emacs a volte mi cancella il file ; eventualmente meglio prima
fare una dozzina di backup e poi  dare un kill con qualche segnale appropiato
per emacs , ciao !!
-- 
Un uomo buono puo' essere stupido e tuttavia rimanere buono.  Ma un
uomo cattivo non puo' assolutamente fare a meno di essere intelligente.
		-- Maksim Gorkij