[CRONJOB] Realizzare un crojob che elimini ricorsivamente

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2854
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

[CRONJOB] Realizzare un crojob che elimini ricorsivamente

Messaggio da DoctorStrange »

Buongiorno a tutti,

Devo realizzare un cronjob che si occupi di eliminare ad una specifica ora, tutti i file e le cartelle di proprietà di uno specifico utente, e con una retention di quattro giorni
Ho realizzato al momento il job in questo modo:

Codice: Seleziona tutto

30 8 * * * -u nextuser find /tmp -mtime +4 -maxdepth 2 -exec rm {} \;
Ma non sono certo che possa funzionare correttamente. Per non dover aspettare quattro giorni e visto che non posso modificarlo, cambiando la retention, perche è un server di produzione, secondo voi, potrebbe funzionare secondo le apsettative?

Grazie
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [CRONJOB] Realizzare un crojob che elimini ricorsivamente

Messaggio da vaeVictis »

Primo suggerimento: in questi casi io farei le prove in locale cambiando mtime con mmin

Detto questo, farei alcune osservazioni in ordine sparso sui dubbi che mi sorgono.
1) temo che il comando possa cancellarti direttamente tutta la directory /tmp. Anche se specifichi l'utente, quindi il problema non si pone in questo caso specifico, io cambierei /tmp con /tmp/*
2) Usando il parametro +4 per l'opzione -mtime, ti prende solo il contenuto "strettamente" più vecchio di 4 giorni.
3) Se non specifichi l'opzione di rm per le directory, non te le cancella. Comunque, nell'output del programma avrai degli errori dovuti all'ordine di rimozione delle directory. Potrebbe cancellarti le directory prima dei file, ma è risolvibile mandando lo standard error in /dev/null
4) Per quanto riguarda la maxdepth, non capisco una cosa. Se ti cancella una directory di profondità 2, ti cancella anche quelle di profondità maggiore di 2, perché sono contenute all'interno di quella di profondità 2.
Potresti postare un esempio di come sono strutturate queste directory.
5) credo possano esserci problemi con directory proprietà di nextuser e contenente materiale di altri utenti. Credo dipenda dai permessi, devo fare alcune ricerche nella documentazione ma al momento non ho tempo.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
DoctorStrange
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2854
Iscrizione: mercoledì 14 ottobre 2015, 9:33
Desktop: Gnome3
Distribuzione: Ubuntu 22.04 LTS Jammy Jellyfish
Sesso: Maschile
Località: Roma, Italia

Re: [CRONJOB] Realizzare un crojob che elimini ricorsivamente

Messaggio da DoctorStrange »

Grazie mille per le dritte,

Dunque:
1) Implementata la tua modifica
2) Ero indeciso se quattro giorni o piu, quindi mi va bene questa retention.
3) non sono sicuro ma, se aggiungessi "rmdir" al comando, otterrei anche la rimozione delle directory di proprietà di quello specifico utente?
4) Io vorrei che venissero cancellate anche tutte le directory annidate, ad eccezione dell'unico caso in cui, se ci fosse annidata una directory di proprietà di un altro utente e, in questo caso non dovrebbe eliminarla.
5) L'idea è quella che questo cronjob, dovrebbe eliminare tutti i files di questo specifico utente, ma solo i suoi files. In teoria questo utente non dovrebbe avere sufficienti grant per eliminare files appartenenti ad altri utenti, e questo specifico utente non è parte dei gruppi di altri utenti.
Il dubbio per è: se dovesse esserci qualche file con permessi 777, questo verrebbe eliminato, con questo cronjob?

Grazie.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [CRONJOB] Realizzare un crojob che elimini ricorsivamente

Messaggio da vaeVictis »

Faccio riferimento ai due utenti:

Codice: Seleziona tutto

grep "intruso\|vaevictis" /etc/passwd
vaevictis:x:1000:1000:vaevictis,,,:/home/vaevictis:/bin/bash
intruso:x:1001:1001:foo,,,:/home/intruso:/bin/bash
che appartengono a questi gruppi:

Codice: Seleziona tutto

groups vaevictis 
vaevictis : vaevictis adm cdrom sudo dip plugdev lpadmin sambashare
groups intruso 
intruso : intruso
Ho creato una directory che simula le proprietà di /tmp

Codice: Seleziona tutto

sudo mkdir faketmp
sudo chmod 1777 faketmp
e al suo interno ho fatto le prove del caso, creando file e directory/sottodirectory appartenenti sia a vaevictis sia a intruso per poi cancellare il vario materiale usando l'utente vaevictis.

Conclusioni per quanto riguarda i file:
/tmp è di proprietà di root, ha lo sticky bit e tutti i permessi abilitati, quindi i file contenuti direttamente in /tmp, indipendentemente dai permessi del file, possono essere eliminati solo da root (che è anche il proprietario della directory /tmp) o dal proprietario del file in questione (perché è impostato lo sticky bit).
I file contenuti in una generica sotto directory di /tmp seguono le regole normali: la possibilità di eliminare un file non dipende né dal suo proprietario né dai suoi permessi, ma solo dai permessi della directory che lo contiene:
Un generico file contenuto in una directory, che non abbia lo sticky bit attivato, può essere cancellato da chiunque abbia i permessi "w" e "x" sulla directory che lo contiene.
Se i permessi "w" e "x" sono impostati solo per il proprietario, solo lui può eliminare il file; se sono impostati per il gruppo proprietario del file, chiunque ne faccia parte può eliminare il file; se sono impostati per gli "altri", qualunque utente può eliminare il file.
Ovviamente, questa situazione si "propaga" nelle sotto directory. Se il file è contenuto in una directory che garantisce i permessi "w" e "x", per poter essere eliminato è necessario che questa directory a sua volta sia contenuta in un albero di directory che garantisca all'utente che vuole eliminare il file il solo permesso "x" ad ogni livello, altrimenti quell'utente non può eliminarlo.
Questo vale anche per un file di cui sei il proprietario. Se un tuo file è all'interno di una directory per cui il tuo utente non ha i permessi "w" e "x", non lo puoi eliminare.
E lo stesso accade se un tuo file è contenuto in una directory a sua volta contenuta in un albero di directory che non garantiscano il permesso "x" al tuo utente a ogni livello.

Il motivo è semplice: devi avere il permesso "x" a tutti i livelli per poter applicare la chiamata di sistema "stat" all'inode del file; ti serve il permesso "w" solo sulla cartella che lo contiene, perché devi modificare il contenuto solo di questa.

Esiste poi una categoria di file detta "immutabile". Si ottiene con il comando "chattr +i percorso_del_file". In questo caso, il file può essere eliminato solo da root, indipendentemente dai permessi visti sopra.

Quanto detto sopra vale per il comando rm. Non devi avere i permessi di lettura per rimuovere un file se ne sai il percorso.
Ma tu li stai cercando con find, quindi a quanto detto sopra devi aggiungere i permessi di lettura.

Pertanto, per quanto riguarda i file, la risposta al punto 5) è:
a) il tuo comando può cancellare file di utenti diversi da nextuser
b) il tuo comando può non trovare file di nextuser contenuti in una directory per la quale nextuser non ha i permessi di lettura.

Il punto a) lo risolvi aggiungendo

Codice: Seleziona tutto

-type f -user nextuser
al comando find. In questo modo il comando find ti trova solo i file che appartengono a all'utente nextuser contenuti in directory per le quali nextuser abbia i permessi di lettura e rimuove solo quelli.
Per risolvere il punto b) devi aggiungere i privilegi di root alle precedenti indicazioni, in modo tale da poter leggere il contenuto di tutte le directory, selezionare solo i file di nextuser ed eliminare solo quelli.
Se non puoi dare privilegi di root, non puoi eliminare i file di nextuser contenuti in directory per i quali nextuser non ha privilegi di lettura, perché find non te li può trovare.


Conclusioni per le directory
Senza entrare nel dettaglio, anche per le directory quel comando dà problemi per motivi analoghi a quelli specificati sopra sui permessi.
Per rispondere al punto 3), rmdir cancella solo le directory vuote quindi non è la soluzione. In generale, se vuoi cercare con find sia file sia directory e se poi le vuoi eliminare con exec, ti basta usare rm con l'opzione -r.
Però, non è la soluzione.
A mio avviso ti conviene fare uno script in cui cancelli file e directory separatamente e poi lanciare quello nel cronjob.
Per rispondere al punto 4), dipende da come vuoi regolarti nei seguenti casi:
4.a) se una directory di nextuser contenesse dei file di un altro utente ma non directory di un altro utente? La cancelli?
4.b) se una directory Foo di nextuser contenesse una sottodirectory Bar di un altro utente, a quanto ho capito non vuoi cancellare Foo. Ma se Bar a sua volta contiene sottodirectory di nextuser che non contengono sottodirectory di altri utenti? Come ti regoli? Le vuoi cancellare quelle sottodirectory di Bar?

Nota bene
Questi discorsi dipendono anche dal fatto che non hai chiarito come gestite i permessi per le directory contenute in /tmp.
Generalmente sono tutte directory che hanno i permessi rwx impostati solo per il proprietario.
Fammi sapere se è tutto chiaro e anche come ti vuoi regolare per quanto riguarda le directory, così ti butto giù uno script.

p.s.:
Il problema sembra banale ma non lo è affatto. Mi scuso per aver postato dei messaggi contenenti errori, di cui ho poi chiesto l'eliminazione.
Spero che questo messaggio sia abbastanza sintetico e soprattutto chiaro. Non è stato semplice sintetizzare le varie prove fatte ed esporre tutto in modo (spero) comprensibile.
Ultima modifica di vaeVictis il martedì 5 ottobre 2021, 0:49, modificato 1 volta in totale.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [CRONJOB] Realizzare un crojob che elimini ricorsivamente

Messaggio da vaeVictis »

Per far capire meglio il senso dei miei ragionamenti del messaggio precedente, ti allego l'esempio "conclusivo" a cui sono arrivato dopo il delirio di prove che questa discussione mi ha spinto a fare.

Con i comandi:

Codice: Seleziona tutto

sudo mkdir faketmp
sudo chmod 1777 faketmp
mkdir -p faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis/QuartoLivelloVaevictis
touch faketmp/PrimoLivelloVaevictis/fooPrimoLivello{Vaevictis,Intruso}.txt
touch faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/fooSecondoLivello{Vaevictis,Intruso}.txt
touch faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis/fooTerzoLivello{Vaevictis,Intruso}.txt
touch faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis/QuartoLivelloVaevictis/fooQuartoLivello{Vaevictis,Intruso}.txt
find -iname "*txt" -exec chmod 400 "{}" \;
sudo find -iname "*intruso.txt" -exec chown intruso:intruso "{}" \;
chmod 700 faketmp/PrimoLivelloVaevictis{,/SecondoLivelloIntruso/TerzoLivelloVaevictis{,/QuartoLivelloVaevictis}}
chmod 705 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso
sudo chown intruso:intruso faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso
ottengo la struttura di directory e sottodirectory con relativi file data da:

Codice: Seleziona tutto

sudo find faketmp/   -ls | sort -k 11
  5243776      4 drwxrwxrwt   3 root     root         4096 ott  4 23:50 faketmp/
  5243983      4 drwx------   3 vaevictis vaevictis     4096 ott  4 23:50 faketmp/PrimoLivelloVaevictis
  5244106      0 -r--------   1 intruso   intruso          0 ott  4 23:50 faketmp/PrimoLivelloVaevictis/fooPrimoLivelloIntruso.txt
  5244101      0 -r--------   1 vaevictis vaevictis        0 ott  4 23:50 faketmp/PrimoLivelloVaevictis/fooPrimoLivelloVaevictis.txt
  5244076      4 drwx---r-x   3 intruso   intruso       4096 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso
  5245007      0 -r--------   1 intruso   intruso          0 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/fooSecondoLivelloIntruso.txt
  5245006      0 -r--------   1 vaevictis vaevictis        0 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/fooSecondoLivelloVaevictis.txt
  5244080      4 drwx------   3 vaevictis vaevictis     4096 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis
  5245630      0 -r--------   1 intruso   intruso          0 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis/fooTerzoLivelloIntruso.txt
  5245011      0 -r--------   1 vaevictis vaevictis        0 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis/fooTerzoLivelloVaevictis.txt
  5244094      4 drwx------   2 vaevictis vaevictis     4096 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis/QuartoLivelloVaevictis
  5251004      0 -r--------   1 intruso   intruso          0 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis/QuartoLivelloVaevictis/fooQuartoLivelloIntruso.txt
  5245679      0 -r--------   1 vaevictis vaevictis        0 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis/QuartoLivelloVaevictis/fooQuartoLivelloVaevictis.txt
Vado a cancellare ricorsivamente la mia directory di primo livello usando l'utente vaevictis

Codice: Seleziona tutto

rm -rf faketmp/PrimoLivelloVaevictis/
rm: impossibile rimuovere 'faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/fooSecondoLivelloIntruso.txt': Permesso negato
rm: impossibile rimuovere 'faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis': Permesso negato
rm: impossibile rimuovere 'faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/fooSecondoLivelloVaevictis.txt': Permesso negato
e quello che rimane è:

Codice: Seleziona tutto

sudo find faketmp/   -ls | sort -k 11
  5243776      4 drwxrwxrwt   3 root     root         4096 ott  4 23:50 faketmp/
  5243983      4 drwx------   3 vaevictis vaevictis     4096 ott  4 23:52 faketmp/PrimoLivelloVaevictis
  5244076      4 drwx---r-x   3 intruso   intruso       4096 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso
  5245007      0 -r--------   1 intruso   intruso          0 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/fooSecondoLivelloIntruso.txt
  5245006      0 -r--------   1 vaevictis vaevictis        0 ott  4 23:50 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/fooSecondoLivelloVaevictis.txt
  5244080      4 drwx------   2 vaevictis vaevictis     4096 ott  4 23:52 faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso/TerzoLivelloVaevictis
in cui si può vedere che non ha cancellato il contenuto di faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso perché vaevictis non ha i permessi "w" su questa directory, e di conseguenza non ha cancellato neanche faketmp/PrimoLivelloVaevictis.
Tutto il resto è stato eliminato.

Se modifichi i permessi di faketmp/PrimoLivelloVaevictis per gli altri, aggiungendo "x", con intruso puoi usare rm per cancellare i file contenuti in faketmp/PrimoLivelloVaevictis/SecondoLivelloIntruso. Non ti cancella la directory di terzo livello perché non intruso non ha i permessi per cancellarne il contenuto. Se fosse vuota te la cancellerebbe.

Giocando ulteriormente coi permessi riottieni la casistica che ho cercato di descrivere nel precedente messaggio.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: [CRONJOB] Realizzare un crojob che elimini ricorsivamente

Messaggio da vaeVictis »

Ciao, ma alla fine come hai risolto?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 9 ospiti