Newsgroup: it.comp.os.linux.sys
Titolo: Controllare gid ricorsivamente?

Avrei bisogno di controllare che i file di dati abbiano almeno sempre
il gid che dovrebbero avere.
Sugli share samba c'è il force group che normalmente funziona, ma una
volta sono riusciti a piazzare un file con gid diverso e non so
come...
Ho provato a prendere un file con altri permessi e spostarlo come
utente amministratore ma mi ha comunque messo il gid giusto, fanno dei
numeri incredibili questi utenti.
Comunque vorrei far controllare i gid automaticamente e in caso
modificarli, uso già monit  per tutto il resto ma mi pare che non
possa controllare in modo ricorsivo, giusto?
Forse è più semplice a sto punto mettere in cron uno script con la
forzatura, però in quel modo non avrei un check quasi immediato come
con monit, altre vie/modi?


La cosa che mi viene in mente è find
Con questo comando
$ find /path/ -printf "%g-%f\n"
dici a find di scriverti la lista dei file (senza directory) come
gruppo-nomefile
mettendo in pipe anche grep, vedi non solo se ci sono files che non
appartengono al gruppo, ma anche quali file e a quale gruppo
appartengono (al limite, usa anche il %h per il path, comunque man find
e hai tutte le indicazioni)
quindi alla fine un bel
$ find /path/ -printf "%g-%f" | grep -v "^gruppo_che_ti_aspetti-"
Non so come te la cavi a espressioni regolari (questa è molto semplice),
ma con l'apice circonflesso ^ agganci il nome del gruppo all'inizio
della riga, quindi se anche il nome del gruppo dovesse trovarsi nel nome
del file, non crea falsi positivi o falsi negativi.
Arricchendo lo switch printf, puoi avere tanti dati in più (access time,
tipo di file, percorso, ecc).
Luca

Luca Pascali ha scritto:

Grazie mille, però il problema è un altro, dovrei comunque eseguire 
questo script in cron e a un intervallo breve.
Vabbeh che non è una gran fatica per il server però sono comunque 
migliaia di files.

 migliaia di files.
Effettivamente messa cosě non č proprio bellissima.
Per lo stretto giro di posta si potrebbe ovviare creando uno script che
esegue il comando, fa una sleep di qualche secondo e ripete a ciclo
continuo. La cache sul filesystem dovrebbe fare il resto.
Non credo, perň, che sia il modo ottimale di fare questo lavoro.
Puoi, perň, iniziare a capire quando vengono creati i files per indagare
e risolvere il problema alla radice (esiste forse anche un ftp sulle
stesse directory?).
Se il problema si presenta di rado, invece, un'esecuzione ogni mezz'ora
potrebbe essere piů che sufficiente.
Eventualmente la cosa potrebbe essere resa piů leggera facendo un
controllo in modo diverso:
partendo da una situazione coerente conosciuta (ad esempio tutti i file
ok), verificare i timestamp delle sole directory in maniera periodica.
Quando un timestamp varia, verificare i gruppi dei files che contiene e
correggere quelli non corretti.
In questo modo il carico č molto piů leggero, non si avvicina al caso di
qualcosa che ti avvisa nel momento in cui un file viene
creato/modificato, ma č sempre meglio che passarsi in rassegna migliaia
di files (nosostante dischi veloci)
Per altre soluzioni cedo la palla.
Luca

 Luca
Comunque dal man del find mi sembra molto più sensata una cosa del genere
find <dir> ! -gid $(trovare gid)
con al limite una exec per cambiare il gruppo.
Basterebbe un for sui gruppi (queto ottiene il gid del gruppo: getent 
group qualita | awk -F ':' '{ print $3; }'")
e sarei già a posto.
Volendo basterebbe cercare sui file più nuovi inseriti sempre con le 
varie opzioni di find.
A proposito come si fa (sarà una stupidata ma non c'era riuscito) a 
loopare su una lista di stringhe prese da variabile?
Tipo
for i in "uno" "due" "tre"
funziona, ma se volessi inserire "uno" "due" e "tre" in una variabile 
che sintassi c'è da usare?
Comunque sì, il problema non si dovrebbe neanche porre e vorrei capire 
come eludere la forzatura di samba (gli utonti fanno magie a volte), 
nessuna idea a questo riguardo?


posso andare al cuore del problema e cercare di cambiare il tuo
approccio?
Qual e' il problema se per qualche momento un file ha un GID diverso?
Vuoi sovraccaricare la macchina perche' una volta avresti scoperto che
un file aveva la GID diversa (e ancora non hai nemmeno capito la
ragione)?
Rappresenta veramente un problema di sicurezza o l'utente non riesce
piu' a scriverci sopra?
Non potresti allontanare gli intervalli di cron e lanciare un semplice
"chgrp -R blabla /bla/bla", magari 2 volte al giorno, e quindi
*fregartene* bellamente di questo *non* problema?
p.s.: prima di fare questa operazione, io cercherei di capire perche'
quel file aveva la gid non consentita dall'opzione di samba.... magari
scoprirai che era una cavolata.
--
Massimiliano

 possa controllare in modo ricorsivo, giusto?
find /directory_partenza -type f -not -gid numero_gid_corretto -exec
chgrp {} gid_corretto \;
tutto su una riga, eliminando -type f se vuoi che controlli anche le
cose che file non sono.
Non puoi chiedere a monit di eseguire uno script periodicamente, non
è Nagios.
-- 
Per rispondermi, sostituisci a nomecognome il mio nome e cognome
To reply me, substitute nomecognome with my real name and surname
http://bitsandchaos.wordpress.com

 
Hai perfettamente ragione, anche io vorrei capire come cavolo è potuto 
succedere, tutto quel che so è che un certo utente che non poteva 
scrivere sullo share ha preso il suo file e ha usato lo share del vicino 
(che può tutto invece) per copiarlo.
Non è un operazione pulitissima (verrà fatta una volta ogni tanto) ma 
d'altronde hanno deciso loro le divisioni in gruppi / permessi.
Ora io ho riprovato le stesse operazioni e comunque il gruppo del file 
viene cambiato! Quindi come c**+* ha fatto?
Uno script per cercare i dissidenti comunque mi è utile, così magari 
risolvo il dilemma!

 
questo trova solo i files (i gruppi si chiamano come le directory.
#!/bin/sh
find /home/calzitex/$1 ! -gid $(getent group $1 | awk -F ':' '{ print 
$3; }')
Comunque forse ho capito, l'altro utente fa parte di Administrators e ha 
gid=0, ho provato a spostare cose come root e in effetti viene meno il 
vincolo di gruppo.
Basta rimettere l'altro utente in "Domain Users" e sono a posto, l'avevo 
messo come Administrator per evitare di metterlo in tutti i gruppi ma 
siccome comunque non funzionava come volevo l'ho poi riaggiunto ai gruppi...

 che sintassi c'è da usare?
Li separi con degli spazi :
guargua@guargua-desktop:~$ prova="uno due tre"
guargua@guargua-desktop:~$ echo $prova
uno due tre
guargua@guargua-desktop:~$ for a in $prova; do echo $a;done
uno
due
tre
-- 
Ciao.
Alessandro 
"Ubuntu" - an African word, meaning "Slackware is too hard for me".

 done
uno due tre

 uno due tre
Sarebbe strano il contrario, visto che con "uno due tre" hai passato
un singolo parametro e non tre parametri distinti. Fai cosi':
for i in $(echo uno due tre); do echo $i; done


 
Ma nell'esempio che fai tu "uno due tre" è una stringa unica perché 
gli apici la fanno interpretare come tale.  Ma se fai
pippo="uno due tre"  ## anche qui gli apici indicano una stringa unica 
ed a pippo viene assegnato la stringa uno due tre.  Cioè gli apici 
vengono rimossi
for i in $pippo   ## esegue correttamente il ciclo sui valori come se 
fosse:
for i in uno due tre	##
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >