Find external SlackPkg files: differenze tra le versioni
(find_external_SlackPkg_files.sh. Uno script per scovare i file estranei ai pacchetti installati nella Slackware.) |
m (Modificati i caratteri accentati con i relativi HTML) |
||
| Riga 3: | Riga 3: | ||
[[Category:Script]] |
[[Category:Script]] |
||
= Introduzione = |
= Introduzione = |
||
| − | I "maniaci delle pulizie" - come me - a volte hanno la necessità di |
+ | I "maniaci delle pulizie" - come me - a volte hanno la |
| − | scovare quei file, presenti nella root directory, che non |
+ | necessità di scovare quei file, presenti nella root directory, |
| − | appartengono a nessun pacchetto installato. Questo infatti permette di |
+ | che non appartengono a nessun pacchetto installato. Questo infatti |
| − | stabilire se quei file sono vecchi e vanno rimossi oppure sono file di |
+ | permette di stabilire se quei file sono vecchi e vanno rimossi oppure |
| − | configurazione (o altro) creati dai programmi a run-time. |
+ | sono file di configurazione (o altro) creati dai programmi a run-time. |
Spesso e volentieri qualcuno installa un pacchetto ma poi si accorge |
Spesso e volentieri qualcuno installa un pacchetto ma poi si accorge |
||
che non gli serviva, quindi lo rimuove. Il dubbio si insinua nella |
che non gli serviva, quindi lo rimuove. Il dubbio si insinua nella |
||
| − | mente di un "maniaco delle pulizie": "ho rimosso tutto? il sistema è |
+ | mente di un "maniaco delle pulizie": "ho rimosso tutto? il sistema |
| − | ritornato come se il pacchetto non fosse mai stato |
+ | è ritornato come se il pacchetto non fosse mai stato |
installato?". Generalmente i dubbi sono infondati, quasi tutti i |
installato?". Generalmente i dubbi sono infondati, quasi tutti i |
||
| − | pacchetti vengono rimossi completamente e non lasciano tracce, ma è |
+ | pacchetti vengono rimossi completamente e non lasciano tracce, ma |
| − | proprio quel 'quasi tutti' che non fa dormire sonno tranquilli :). |
+ | è proprio quel 'quasi tutti' che non fa dormire sonno |
| + | tranquilli :). |
||
Lo script find_external_SlackPkg_files.sh esegue una scansione di |
Lo script find_external_SlackPkg_files.sh esegue una scansione di |
||
| − | tutta la root directory e controlla, file per file, se esso è stato |
+ | tutta la root directory e controlla, file per file, se esso è |
| − | installato da un pacchetto Slackware oppure no. Quindi visualizza in |
+ | stato installato da un pacchetto Slackware oppure no. Quindi |
| − | output tutti quei file "estranei" ai pacchetti. |
+ | visualizza in output tutti quei file "estranei" ai pacchetti. |
| − | Lo script può essere eseguito sia come root che come utente |
+ | Lo script può essere eseguito sia come root che come utente |
| − | normale. In quest'ultimo caso, ovviamente, lo script non potrà |
+ | normale. In quest'ultimo caso, ovviamente, lo script non potrà |
| − | scandire quelle directory di proprietà di altri utenti, ma darà |
+ | scandire quelle directory di proprietà di altri utenti, ma |
| − | comunque dei buoni risultati. |
+ | darà comunque dei buoni risultati. |
= L'algoritmo = |
= L'algoritmo = |
||
| − | L'algoritmo è molto semplice, lo script esegue un '''find''' sulla |
+ | L'algoritmo è molto semplice, lo script esegue un '''find''' |
| − | root directory filtrando alcuni path (si veda la sezione [[#Filtrare dei percorsi]]). |
+ | sulla root directory filtrando alcuni path (si veda la sezione |
| − | Una volta creata questa 'file list', lo script individua anche tutti i |
+ | [[#Filtrare dei percorsi]]). Una volta creata questa 'file list', lo |
| − | link simbolici creati dagli script '''doinst.sh''' dei vari |
+ | script individua anche tutti i link simbolici creati dagli script |
| − | pacchetti. Quindi, controlla quali tra i file presenti nella 'file |
+ | '''doinst.sh''' dei vari pacchetti. Quindi, controlla quali tra i file |
| − | list' non appartiene ad un pacchetto e non è neanche un link simbolico |
+ | presenti nella 'file list' non appartiene ad un pacchetto e non |
| − | creato da un '''doinst.sh'''. |
+ | è neanche un link simbolico creato da un '''doinst.sh'''. |
| + | |||
| + | {{Information |
||
| + | |Informazione: |
||
| + | |Si capisce benissimo che l'algoritmo è semplice ma la sia esecuzione è bella lunga. Diciamo che la vostra CPU non vi ringraziera :). |
||
| + | }} |
||
== Filtrare dei percorsi == |
== Filtrare dei percorsi == |
||
| Riga 48: | Riga 48: | ||
* /var/log/removed_scripts |
* /var/log/removed_scripts |
||
| − | Si possono inoltre (ed è consigliato farlo) impostare dei filtri |
+ | Si possono inoltre (ed è consigliato farlo) impostare dei |
| − | utente semplicemente creando il file |
+ | filtri utente semplicemente creando il file |
| − | ''~/.find_external_SlackPkg_files''. Il formato del file è il |
+ | ''~/.find_external_SlackPkg_files''. Il formato del file è il |
seguente: |
seguente: |
||
* tutte le righe vuote e le righe che iniziano con un '#' sono ignorate. |
* tutte le righe vuote e le righe che iniziano con un '#' sono ignorate. |
||
| − | * ogni riga non ignorata deve contenere esattamente un percorso e, opzionalmente, un comando da controllare. In quest'ultimo caso, il comando deve essere separato dal percorso da almeno un carattere di spaziatura; il percorso associato sarà filtrato se, e solo se, il comando esiste nel PATH. |
+ | * ogni riga non ignorata deve contenere esattamente un percorso e, opzionalmente, un comando da controllare. In quest'ultimo caso, il comando deve essere separato dal percorso da almeno un carattere di spaziatura; il percorso associato sarà filtrato se, e solo se, il comando esiste nel PATH. |
Quindi ad esempio, se il file contiene le seguenti righe: |
Quindi ad esempio, se il file contiene le seguenti righe: |
||
| Riga 65: | Riga 65: | ||
/usr/share/mime update-mime-database |
/usr/share/mime update-mime-database |
||
</pre> |
</pre> |
||
| − | Allora lo script ignorerà: |
+ | Allora lo script ignorerà: |
* la directory ''/home'' |
* la directory ''/home'' |
||
* le directory contenenti i filesystem montati, ma che sono estranei alla distribuzione (''/mnt'' e ''/media''). |
* le directory contenenti i filesystem montati, ma che sono estranei alla distribuzione (''/mnt'' e ''/media''). |
||
| Riga 73: | Riga 73: | ||
{{Warning |
{{Warning |
||
|Nota: |
|Nota: |
||
| − | |Se il path da filtrare contiene uno spazio, allora lo script penserà che ciò che si trova dopo lo spazia sia un comando da controllare. In questo caso, affinché tutto funzioni, bisogna aggiungere un altro spazio e poi un comando sicuramente esistente (ad esempio la bash, visto che lo script è interpretato proprio da questa shell). |
+ | |Se il path da filtrare contiene uno spazio, allora lo script penserà che ciò che si trova dopo lo spazia sia un comando da controllare. In questo caso, affinché tutto funzioni, bisogna aggiungere un altro spazio e poi un comando sicuramente esistente (ad esempio la bash, visto che lo script è interpretato proprio da questa shell). |
}} |
}} |
||
| Riga 90: | Riga 90: | ||
= Bug = |
= Bug = |
||
Ci sono un po' di note sull'algoritmo che vale la pena segnalare: |
Ci sono un po' di note sull'algoritmo che vale la pena segnalare: |
||
| − | * alcuni '''doinst.sh''' sono scritti in maniera particolare e fanno ben altro che creare semplici link simbolici. Un caso per tutti è il '''doinst.sh''' della '''bash''' dove il file installato dal pacchetto non si chiama '''bash''' ma, ad esempio '''bash4.new'''. Sarà poi lo script di post-installazione a rinominare il file installato come '''bash'''. Quindi per lo script, paradossalmente, l'interprete che lo esegue (la shell bash, appunto) non è stato installato da nessun pacchetto. |
+ | * alcuni '''doinst.sh''' sono scritti in maniera particolare e fanno ben altro che creare semplici link simbolici. Un caso per tutti è il '''doinst.sh''' della '''bash''' dove il file installato dal pacchetto non si chiama '''bash''' ma, ad esempio '''bash4.new'''. Sarà poi lo script di post-installazione a rinominare il file installato come '''bash'''. Quindi per lo script, paradossalmente, l'interprete che lo esegue (la shell bash, appunto) non è stato installato da nessun pacchetto. |
| − | * il comando '''[''' crea problemi con '''grep'''. Quest'ultimo comando viene usato per controllare se i file nella 'file list' appartengono o meno ad un pacchetto o ad un link creato da i '''doinst.sh'''. Il problema è che il carattere '[' ha un significato particolare per '''grep''' e quindi viene sollevato un errore. Si consiglia di filtrare il comando '''[''' aggiungengo nel file di filtro la seguente riga:<pre>*/bin/[</pre> |
+ | * il comando '''[''' crea problemi con '''grep'''. Quest'ultimo comando viene usato per controllare se i file nella 'file list' appartengono o meno ad un pacchetto o ad un link creato da i '''doinst.sh'''. Il problema è che il carattere '[' ha un significato particolare per '''grep''' e quindi viene sollevato un errore. Si consiglia di filtrare il comando '''[''' aggiungengo nel file di filtro la seguente riga:<pre>*/bin/[</pre> |
== Le glibc == |
== Le glibc == |
||
| Riga 100: | Riga 100: | ||
proprio per impedire che le librerie vengano eliminate insieme al |
proprio per impedire che le librerie vengano eliminate insieme al |
||
pacchetto. Se questo accadesse, infatti, un aggiornamento 'a caldo' |
pacchetto. Se questo accadesse, infatti, un aggiornamento 'a caldo' |
||
| − | delle '''glibc''' farebbe sì che tutti i comandi linkati con le |
+ | delle '''glibc''' farebbe sì che tutti i comandi linkati con le |
| − | vecchie librerie non funzionino più. Questo vorrebbe dire un blocco |
+ | vecchie librerie non funzionino più. Questo vorrebbe dire un |
| − | del sistema poiché non si avrebbero più a disposizione i comandi |
+ | blocco del sistema poiché non si avrebbero più a |
| − | basilari come '''rm''', '''ls''', etc... |
+ | disposizione i comandi basilari come '''rm''', '''ls''', etc... |
| − | C'è da dire però che lo script, oltre alle '''glibc''' attualmente |
+ | C'è da dire però che lo script, oltre alle '''glibc''' |
| − | installate segnala anche le '''glibc''' vecchie. Queste ultime si |
+ | attualmente installate segnala anche le '''glibc''' vecchie. Queste |
| − | possono tranquillamente eliminare se tutto il sistema è aggiornato, ma |
+ | ultime si possono tranquillamente eliminare se tutto il sistema |
| − | si vada comunque con i piedi di piombo. |
+ | è aggiornato, ma si vada comunque con i piedi di piombo. |
{{Warning |
{{Warning |
||
| Riga 124: | Riga 124: | ||
= Copyright - License = |
= Copyright - License = |
||
| − | Autore (ultima modifica): [[Utente:Spina|spina]] 23:14, 3 set 2011 (CEST) |
+ | Autore (ultima modifica): [[Utente:Spina|spina]] 23:32, 3 set 2011 (CEST) |
{{Information |
{{Information |
||
|GNU Free Documentation Licence |
|GNU Free Documentation Licence |
||
Versione delle 23:32, 3 set 2011
Indice |
Introduzione
I "maniaci delle pulizie" - come me - a volte hanno la necessità di scovare quei file, presenti nella root directory, che non appartengono a nessun pacchetto installato. Questo infatti permette di stabilire se quei file sono vecchi e vanno rimossi oppure sono file di configurazione (o altro) creati dai programmi a run-time.
Spesso e volentieri qualcuno installa un pacchetto ma poi si accorge che non gli serviva, quindi lo rimuove. Il dubbio si insinua nella mente di un "maniaco delle pulizie": "ho rimosso tutto? il sistema è ritornato come se il pacchetto non fosse mai stato installato?". Generalmente i dubbi sono infondati, quasi tutti i pacchetti vengono rimossi completamente e non lasciano tracce, ma è proprio quel 'quasi tutti' che non fa dormire sonno tranquilli :).
Lo script find_external_SlackPkg_files.sh esegue una scansione di tutta la root directory e controlla, file per file, se esso è stato installato da un pacchetto Slackware oppure no. Quindi visualizza in output tutti quei file "estranei" ai pacchetti.
Lo script può essere eseguito sia come root che come utente normale. In quest'ultimo caso, ovviamente, lo script non potrà scandire quelle directory di proprietà di altri utenti, ma darà comunque dei buoni risultati.
L'algoritmo
L'algoritmo è molto semplice, lo script esegue un find sulla root directory filtrando alcuni path (si veda la sezione #Filtrare dei percorsi). Una volta creata questa 'file list', lo script individua anche tutti i link simbolici creati dagli script doinst.sh dei vari pacchetti. Quindi, controlla quali tra i file presenti nella 'file list' non appartiene ad un pacchetto e non è neanche un link simbolico creato da un doinst.sh.
| Informazione:
|
| Si capisce benissimo che l'algoritmo è semplice ma la sia esecuzione è bella lunga. Diciamo che la vostra CPU non vi ringraziera :). |
Filtrare dei percorsi
Lo script non scandisce tutta la root directory, ma filtra i seguenti percorsi speciali:
- /dev
- /proc
- /root
- /sys
- /var/log/packages
- /var/log/scripts
- /var/log/removed_packages
- /var/log/removed_scripts
Si possono inoltre (ed è consigliato farlo) impostare dei filtri utente semplicemente creando il file ~/.find_external_SlackPkg_files. Il formato del file è il seguente:
- tutte le righe vuote e le righe che iniziano con un '#' sono ignorate.
- ogni riga non ignorata deve contenere esattamente un percorso e, opzionalmente, un comando da controllare. In quest'ultimo caso, il comando deve essere separato dal percorso da almeno un carattere di spaziatura; il percorso associato sarà filtrato se, e solo se, il comando esiste nel PATH.
Quindi ad esempio, se il file contiene le seguenti righe:
# My comment /home /mnt /media /usr/share/fonts/*.dir /usr/share/mime update-mime-database
Allora lo script ignorerà:
- la directory /home
- le directory contenenti i filesystem montati, ma che sono estranei alla distribuzione (/mnt e /media).
- tutti i file generati dal comando mkfontdir
- la directory /usr/share/mime se, e solo se, esiste il comando update-mime-database
| Nota:
|
| Se il path da filtrare contiene uno spazio, allora lo script penserà che ciò che si trova dopo lo spazia sia un comando da controllare. In questo caso, affinché tutto funzioni, bisogna aggiungere un altro spazio e poi un comando sicuramente esistente (ad esempio la bash, visto che lo script è interpretato proprio da questa shell). |
| Nota:
|
| I percorsi sono passati al comando find tramite l'uso della sua opzione -path. Si veda il manuale di find per conoscere il formato accettato. |
Le opzioni
-h
Questa opzione ha il solo scopo di mostrare l'help.
-f
Mostra in output i percorsi filtrati ed esce.
Bug
Ci sono un po' di note sull'algoritmo che vale la pena segnalare:
- alcuni doinst.sh sono scritti in maniera particolare e fanno ben altro che creare semplici link simbolici. Un caso per tutti è il doinst.sh della bash dove il file installato dal pacchetto non si chiama bash ma, ad esempio bash4.new. Sarà poi lo script di post-installazione a rinominare il file installato come bash. Quindi per lo script, paradossalmente, l'interprete che lo esegue (la shell bash, appunto) non è stato installato da nessun pacchetto.
- il comando [ crea problemi con grep. Quest'ultimo comando viene usato per controllare se i file nella 'file list' appartengono o meno ad un pacchetto o ad un link creato da i doinst.sh. Il problema è che il carattere '[' ha un significato particolare per grep e quindi viene sollevato un errore. Si consiglia di filtrare il comando [ aggiungengo nel file di filtro la seguente riga:
*/bin/[
Le glibc
Le librerie glibc non sono installate in maniera canonica. Il pacchetto installa queste librerie in una directory temporanea chiamata incoming e poi lo script di post-installazione sposta tutte le librerie nella locazione opportuna. Questo viene fatto proprio per impedire che le librerie vengano eliminate insieme al pacchetto. Se questo accadesse, infatti, un aggiornamento 'a caldo' delle glibc farebbe sì che tutti i comandi linkati con le vecchie librerie non funzionino più. Questo vorrebbe dire un blocco del sistema poiché non si avrebbero più a disposizione i comandi basilari come rm, ls, etc...
C'è da dire però che lo script, oltre alle glibc attualmente installate segnala anche le glibc vecchie. Queste ultime si possono tranquillamente eliminare se tutto il sistema è aggiornato, ma si vada comunque con i piedi di piombo.
| Attenzione:
|
| Le glibc rappresentano un altro classico caso di doinst.sh non banale . Si faccia quindi attenzione ad eliminare 'a priori' tutti i file segnalati dallo script. |
Lo script
Bene, è ora giunto il momento di scaricare e provare lo script, che può essere trovato a questo link: find_external_SlackPkg_files.sh
Vedere anche
Copyright - License
Autore (ultima modifica): spina 23:32, 3 set 2011 (CEST)
| GNU Free Documentation Licence
|
| This article is released under the GNU Free Documentation Licence. You are welcome to copy and redistribute it (subject to certain conditions). |