Pagina 1 di 1
Tempo di login
Inviato: lun 24 ago 2009, 14:44
da zxzxasas
Buongiorno!
Ho realizzato uno script che esegue un logout dopo 1:45. Posto il codice:
Codice: Seleziona tutto
#!/bin/bash
user="`users`"
dir="/var/log/script/"
if [[ ! -d $dir ]];then
mkdir /var/log/script
fi
if [[ ! -e $dir$user ]];then
touch $dir$user //ecco il problema
fi
tmp=`cat $dir$user`
for((;tmp<=6300;tmp++));do
echo $tmp > $dir$user
sleep 1
done
zenity --info --text="Hai finito il tempo a tua disposizione, il computer si spegnerà tra un minuto" &
sleep 60
/sbin/shutdown -r now
Ho un problema.
Questo script deve avviarsi da solo al login e chiudersi al logout dell' utente, ma l' utente stesso non deve poter nè leggere nè scrivere sullo script, ma soprattutto non deve poter scrivere sul file dove è conservato il tempo trascorso.
Per il primo problema avevo pensato di modificare lo script adduser e aggiungere le righe:
Codice: Seleziona tutto
cp /root/tempo.sh /home/"$1"/.kde/Autostart/tempo.sh
chown root:root /home/"$1"/.kde/Autostart/tempo.sh
chmod 711 /home/"$1"/.kde/Autostart/tempo.sh
Gli utenti vanno aggiunti da root.
(ancora non ho provato, spero di non aver detto idiozie)
Però, così facendo, non saprei come risolvere il secondo problema, perchè se lo script è avviato dall' utente, l' utente non può scrivere sul file dove viene registrato il tempo trascorso.
Idee? Soluzioni alternative?
Re: Tempo di login
Inviato: lun 24 ago 2009, 15:42
da sya54M
ciao pasquale, il fatto che scrivi su disco ogni secondo è la stessa cosa spiacevole che non volevo fare io quando parlammo di un mio script, ricordi?
riguardo il tuo problema, credo sia impossibile che l'utente non possa avere accesso al file creato se è lui a crearlo, devi solo sperare che l'utente non sappia come funziona il sistema.
lo sleep 60 e il conseguente shutdown -r now è poco elegante:
e perchè usi zenity per la finestrella, che non cè su slackware?
è così bello kdialog...

Re: Tempo di login
Inviato: lun 24 ago 2009, 15:58
da zxzxasas
Beh Andrè, considerando che è per una manifestazione dove devo fare un server, 7 client e il cablaggio senza che mi diano un centesimo, onestamente non mi faccio particolari problemi circa lo stress dell' hardware, visto che mi hanno chiamato loro e non mi sono proposto io!
Comunque, a me serve un sistema che mi permetta di fare una cosa simile. Nessuna idea?
Avevo ora pensato ad usare il SetUID. In modo tale da permettere l' esecuzione all' utente ma con i permessi di amministratore.
In tal modo dando chown root:root e chmod 711 il proprietario è root e l' utente può solo eseguire. Ora se spunto il SetUID dovrei riuscire ad eseguire lo script come root senza che l' utente possa toccare nulla.
Giusto?
Per la finestrella, credo che userò knotify (anche se i clients hanno debian)
Re: Tempo di login
Inviato: lun 24 ago 2009, 16:22
da paperboy
shutdown -r -t 105 & dentro /etc/profile.d non funge?
oppure {sleep $tempo; kdialog --sorry "messaggio di avviso" &; shutdown -r -t 60}& sempre in /etc/profile.d
Re: Tempo di login
Inviato: lun 24 ago 2009, 16:39
da raffaele181188
Il quesito è interessante, pensavo fosse più semplice da risolvere, invece da quello che ho cercato non ho trovato niente nemmeno per le sessioni di X, KDE o GNOME... Comunque le soluzioni che proponi mi sembrano troppo intricate, e poi un utente normale può eseguire /sbin/shutdown? Una soluzione potrebbe essere farsi un programmino demone, registrarci l'utente all'avvio con una riga in /etc/profile, e lasciare a quel programmino il compito di avvisare l'utente che il tempo a sua disposizione sta per scadere (magari anche 15, 10 e 5 minuti prima), per poi effettuare logout e shutdown (ma perchè proprio lo shutdown e non il logout?). Comunque non credo che questa cosa sia facile/bella da risolvere con la shell
Re: Tempo di login
Inviato: lun 24 ago 2009, 17:04
da zxzxasas
C' è un problema. Il tempo deve essere cumulativo, cioè deve essere distribuito su 24 ore anche ad intervalli di n minuti.
Per quanto riguarda l' esecuzione di shutdown, un utente normale non può farlo.
Ma comunque, io devo solamente disconnettere l' utente, non spegnere il pc. Effettivamente, quando ho scritto quelle righe l' idea di fondo era ancora di mettere le righe in /etc/rc.d/rc.local e quindi per chiudere lo script occorreva riavviare. Però poi mi sono accorto che `users` non può restituire nulla dato che nessun utente è loggato.
Ad ogni modo, ho provato a fare qualcosa tipo questa:
Codice: Seleziona tutto
#!/bin/bash
dir=/var/log/script/
for((;;));do
user=`users`
if [[ ! -z $user ]];then
if[[ $user != root ]];then
if [[ ! -e $dir$user ]];then
touch $dir$user
fi
tt=`cat $dir$user`
sleep 1
tt=tt+1
if ((i>=6300));then
//chiudi sessione
fi
fi
fi
done
Ma non so `users` come funziona, quindi faccio qualche prova!
Re: Tempo di login
Inviato: lun 24 ago 2009, 18:28
da zxzxasas
Codice: Seleziona tutto
#!/bin/bash
dir=/var/log/time/
if [[ ! -d $dir ]];then
mkdir $dir
fi
for((;;));do
user=`users`
if [[ ! -z "$user" ]];then
if [[ ! -e "$dir$user" ]];then
touch "$dir$user"
echo 0 > "$dir$user"
fi
tt=`cat $dir$user`
((tt=tt+1))
echo "Stampo incremento"
echo $tt > "$dir$user"
fi
sleep 1
tt=0
done
Allora, questo è il codice di uno script funzionante...quasi!
Chiamato rc.time e fatto avviare da rc.local in background funziona...quasi!
Il punto è che `users` a un certo punto comincia non più a restituire l' utente, ma comincia a fare qualcosa del tipo:
Codice: Seleziona tutto
pasquale@darkstar:~$ cat /var/log/time/
pasquale
pasquale pasquale
pasquale pasquale pasquale
pasquale pasquale pasquale pasquale
pasquale pasquale pasquale pasquale pasquale
Codice: Seleziona tutto
pasquale@darkstar:~$ cat /var/log/time/pasquale\ pasquale
24
Codice: Seleziona tutto
pasquale@darkstar:~$ cat /var/log/time/pasquale\ pasquale\ pasquale
24
Insomma, un comportamento abbastanza strano...
Re: Tempo di login
Inviato: lun 24 ago 2009, 19:46
da conraid
users ti fa gli utenti collegati, basta che apri un terminale ed hai quel comportamento
prova con whoami
Re: Tempo di login
Inviato: lun 24 ago 2009, 20:03
da zxzxasas
Conraid, il problema è che se faccio avviare lo script in rc.local, whoami cosa mi dice?
Codice: Seleziona tutto
#!/bin/bash
dir=/var/log/time/
if [[ ! -d $dir ]];then
mkdir $dir
fi
for((;;));do
user=`users | cut -d ' ' -f 1`
if [[ ! -z "$user" ]];then
if [[ ! -e "$dir$user" ]];then
touch "$dir$user"
echo 0 > "$dir$user"
fi
tt=`cat $dir$user`
((tt=tt+1))
echo "Stampo incremento"
echo $tt > "$dir$user"
fi
if ((tt>=6200));then
kdialog --sorry "Il Sistema si spegnerà tra 60 secondi" &;
sleep 60
pkill X
fi
sleep 1
done
Ho pensato che tagliando la stdout di users poteva funzionare.
In effetti pare che vada ma non conoscendo bene users non so se ci sono delle problematiche che sto trascurando...
Re: Tempo di login
Inviato: mar 25 ago 2009, 10:50
da conraid
zxzxasas ha scritto:Conraid, il problema è che se faccio avviare lo script in rc.local, whoami cosa mi dice?
probabilmente root, visto che nessun utente si è ancora collegato
Io lo metterei nel profile.d cercando un modo di non farlo ripetere (se un utente si logga in altro terminale, etc...)
In questo modo hai anche la possibilità di valutare i casi in cui il pc non viene spento o riavviato, ma l'utente cambia
Re: Tempo di login
Inviato: mar 25 ago 2009, 20:14
da zxzxasas
conraid ha scritto:zxzxasas ha scritto:Conraid, il problema è che se faccio avviare lo script in rc.local, whoami cosa mi dice?
probabilmente root, visto che nessun utente si è ancora collegato
Io lo metterei nel profile.d cercando un modo di non farlo ripetere (se un utente si logga in altro terminale, etc...)
In questo modo hai anche la possibilità di valutare i casi in cui il pc non viene spento o riavviato, ma l'utente cambia
Beh comunque, lo script sopra, a condizione che sia loggato solo un utente, va più che bene. Ovviamente il problema si pone quando ci sono più utenti loggati.
`users` dà stringa vuota se non è loggato alcun utente, quindi basta controllare se la stringa è vuota o è un utente (diverso da root possibilmente

)
Re: Tempo di login
Inviato: mar 25 ago 2009, 23:20
da raffaele181188
Comunque, dal momento che il quesito che hai posto è davvero interessante, io mi sto documentando
Solo che, da quanto ho capito, "artigianalmente" non è possibile trovare soluzioni raffinate, quindi sto cercando qualche distro nata apposta
Non immaginavo, all'inizio della ricerca, che questa cosa potesse essere così difficile, e ancora adesso mi pare strano per un sistema nato multiusers... [-(
Re: Tempo di login
Inviato: mer 26 ago 2009, 2:22
da zxzxasas
raffaele181188 ha scritto:Comunque, dal momento che il quesito che hai posto è davvero interessante, io mi sto documentando
Solo che, da quanto ho capito, "artigianalmente" non è possibile trovare soluzioni raffinate, quindi sto cercando qualche distro nata apposta
Non immaginavo, all'inizio della ricerca, che questa cosa potesse essere così difficile, e ancora adesso mi pare strano per un sistema nato multiusers... [-(
Ci sto lavorando alla versione multiutente...allora quello che sto considerando è:
-possono esserci più utenti loggati
-l' accento grave dovrebbe restituire stdout argomento per argomento
Quindi, supponiamo che l' stdout di users è:
pasquale utente pasquale utente utente asd asd asd io slack
il problema dell' utente che si chiama "io slack" viene gestito in automatico perchè dovrebbe essere un solo argomento.
Inoltre, passando direttamente nel path `users` anzichè dovrebbe considerare l' output argomento per argomento...ma che ne esce? un casino? inoltre, non mi pare che funzioni...beh, domani provo!