# Idiota! IO!?!

## bandreabis

Cosa fa il comando:

```
rm -r /etc/hibernate
```

cosa dovrebbe cancellare?

----------

## randomaze

 *bandreabis wrote:*   

> Cosa fa il comando:
> 
> ```
> rm -r /etc/hibernate
> ```
> ...

 

 :Question: 

Con chi stai parlando?

----------

## gioi

direi il file o la directory /etc/hibernate (-r si usa per le directory)...

----------

## bandreabis

 *randomaze wrote:*   

>  *bandreabis wrote:*   Cosa fa il comando:
> 
> ```
> rm -r /etc/hibernate
> ```
> ...

 

Chiedo al forum.

PS Idiota sono io!  :Rolling Eyes: 

----------

## bandreabis

Ve lo dico io.

Cancella TUTTA la /etc  :Exclamation: 

Andrea

EDIT: posso dire addio alla mia gentoo vero?

----------

## mouser

 *bandreabis wrote:*   

> Ve lo dico io.
> 
> Cancella TUTTA la /etc 
> 
> Andrea

 

Se hibernate e' un file e' normalissimo che tutta la etc venga cancellata... purtroppo se non hai fatto backup le uniche due soluzioni che mi vengono in mente sono queste:

- Da livecd ristari lo stage, ti copi la etc nella tua e riemergi tutti i programmi che avevi installato (perderai quasi tutte le configurazioni)

- Reinstalli gentoo

Con qualsiasi comando bisogna stare ben attenti prima di aggiugere un -r o un -R  :Rolling Eyes: 

Ciriciao

mouser  :Wink: 

----------

## ProT-0-TypE

normale?? veramente non è assolutamente normale. dovrebbe cancellare solo quel file in ogni caso

----------

## bandreabis

Beh, ora ho solo voglia di spegnere tutto!

----------

## bandreabis

 *ProT-0-TypE wrote:*   

> normale?? veramente non è assolutamente normale. dovrebbe cancellare solo quel file in ogni caso

 

Normale non so, ma così è.. due su due!  :Embarassed: 

Solo che ora so come ho fatto a fare il disastro.

@mouser: credo che seguirò la prima via che hai indicato, almeno sta volta ho 

```
/var/lib/portage/world
```

 e so esattamente pacchetti e loro useflag e versioni installate.

Con 

```
emerge -e world
```

 vedo le useflag, con 

```
emerge -uDpv world
```

 vedo le versioni.

Mi sento il tizio del titolo, ma che posso fare... il saggio impara dagli errori degli altri, lo stolto da quelli propri.... l'idiota non impara un ciuffo!

----------

## lavish

non è possibile che tu abbia cancellato /etc con quel comando.

```
blackhole ~ $ cd /tmp/

blackhole /tmp $ touch a b c d e

blackhole /tmp $ ls

a  b  c  d  e

blackhole /tmp $ rm -r /tmp/c

blackhole /tmp $ ls

a  b  d  e

```

----------

## Kernel78

```
mkdir -p /tmp/prova

touch /tmp/prova/uno

touch /tmp/prova/due

rm -r /tmp/prova/uno

ls /tmp/prova
```

Il sorprendente risultato sarà :

[suspance]

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

[/suspance]

```
due
```

Se a te ha cancellato tutta la directory o avevi dei gravi problemi all'installazione o hai sbagliato il comando ...

In ogni caso io suggerisco sempre di mettere le opzioni come -r o -rf alla fine del comando in questo modo un invio che ci scappa causa danni più circoscritti ...

----------

## GiRa

Per me hai scritto una delle cose più ricorrenti nei fuckup!

```
# rm -r /etc/ hibernate
```

----------

## Kernel78

Giusto per curiosità prova a estrarre dalla history di bash il comando incriminato, almeno vediamo di capire cosa sia successo realmente.

----------

## bandreabis

Beh! la mia installazione era fresca fresca, cosa può essere corrotto?

Cmq non compila più nulla... al via la fase 2!

----------

## Kernel78

 *bandreabis wrote:*   

> Beh! la mia installazione era fresca fresca, cosa può essere corrotto?
> 
> Cmq non compila più nulla... al via la fase 2!

 

Le opzioni sono poche, se non era corrotto il sw hai sbagliato tu il comando, quello che sostieni di aver dato non poteva ne doveva cancellare tutta la directory ... per questo suggerivo di controllare la history della bash.

----------

## bandreabis

la mia risposta era stata scritta prima di leggere i commenti sulla bash_history (e spedita dopo che avete postato voi, scusate la mia lentezza... o dovreste andare più piano voi   :Smile:  ).

Ho guardato e ho trovato il comando che ho scritto nel primo post.

Possibile che il problema sia la mancanza della slash dopo hibernate?

So, ora solo!, che con non mi cancella la directory.

----------

## !equilibrium

un'altra possibile 'giustificazione' potrebbe essere l'uso di coreutils non stabili e soggette a qualche strano bug. che versione stai usando?

----------

## Sasdo

onde evitare altre cose simili, ti mostro un trucchetto inventato da un mio amico:

```
touch -- -i
```

dentro ogni directory "vitale".

funziona anche se dai rm -f

 :Smile: 

ciao!

----------

## bandreabis

coreutils stabili! (domanda... comprendono anche il comando useradd?)

Forse sono proprio idiota.

EDIT: sasdo, come funziona quel comando? Quando va dato?

----------

## Kernel78

 *bandreabis wrote:*   

> la mia risposta era stata scritta prima di leggere i commenti sulla bash_history (e spedita dopo che avete postato voi, scusate la mia lentezza... o dovreste andare più piano voi   ).
> 
> Ho guardato e ho trovato il comando che ho scritto nel primo post.
> 
> Possibile che il problema sia la mancanza della slash dopo hibernate?
> ...

 

Se il comando era quello il problema è altrove, ti assicuro (ho anche appena fatto delle prove):

- rm -r /tmp/prova/uno cancella uno a prescindere che sia un file o una directory lasciando inalterato il contenuto di /tmp/prova

- rm -r /tmp/prova/uno restituisce errore nel caso non esista un file o una directory  di nome uno

- in nessuno dei casi che ho provato sono riuscito a cancellare tutto il contenuto di /tmp/prova dicendogli di cancellare /tmp/prova/uno

----------

## !equilibrium

 *bandreabis wrote:*   

> coreutils stabili! (domanda... comprendono anche il comando useradd?)

 

il comando useradd è contenuto in sys-apps/shadow

----------

## bandreabis

 *!equilibrium wrote:*   

>  *bandreabis wrote:*   coreutils stabili! (domanda... comprendono anche il comando useradd?) 
> 
> il comando useradd è contenuto in sys-apps/shadow

 

e il man di adduser? Se lo emergo senza nls ho il man in inglese? Concedetemi sto off-topic che sono disperato per dover rifare da capo.

----------

## Sasdo

 *bandreabis wrote:*   

> coreutils stabili! (domanda... comprendono anche il comando useradd?)
> 
> Forse sono proprio idiota.
> 
> EDIT: sasdo, come funziona quel comando? Quando va dato?

 

L'idea (assolutamente geniale secondo me) è che crei un file che si chiama "-i" che guardacaso coincide con l'opzione "interactive" di rm.

Con questa opzione rm chiede se si è sicuri di voler cancellare un dato file.

facendo così:

```
cd /etc

touch -- -i

```

ottengo che nella directory /etc ho creato un file con nome "-i"

A questo punto, mi accorgo che il suggerimento che ti ho dato non è valido per un rm -rf /etc

...porc!!

Vabbè, proseguo con la spiegazione, una volta creato quel file, al successivo lancio del comando:

```
cd /etc

rm -rf *
```

rm interpreterà quel -i come un'opzione e non come il nome di un file e quindi entrerà in modalità "interactive".

Purtroppo però mi sono accorto solo ora che questo trucchetto non risolve il problema dell'rm -rf /etc

... si fa sempre più forte in me l'idea di scrivere un programmino/script configurabile che rimpiazzi rm e che consenta di definire quelle directory per cui la modalità interactive sia obbligatoria...

...scusami se ho aggiunto confusione... questo caldo unito allo studio di Calcolo delle Probabilità e Statistica mi ha fatto dire vaccate... pardòn  :Smile: 

ciao

----------

## Danilo

 *Sasdo wrote:*   

> 
> 
> A questo punto, mi accorgo che il suggerimento che ti ho dato non è valido per un rm -rf /etc
> 
> 

 

Se e' solo quello puoi usare la feature di rm che non cancella implicitamente le directory invisibili.

In pratica fai un qualcosa del tipo:

```

cd /

mv etc .etc

ln -s /.etc /etc

```

se fai rm -rf /* (o -rm -rf /)  .etc ti rimane

se fai  rm -rf /etc ti cancella solo il link.

se vuoi cancellare .etc  devi dirglielo esplicitamente rm -rf .* o rm -rf .etc

Lo uso sulle directories importanti, (Desktop, bilancio,  fotoImportanti) da quando ho dato un rm -rf * dalla mia $HOME

------------ EDIT -------------

Ovvio che se do :

```

cd /etc

rm -rf * 

```

cancello tutto

----------

## mouser

Scusate, ma più semplicemente non basta mettere in /etc/profile e ~/.bashrc

```
alias rm="rm -i"
```

???

Ciriciao

mouser  :Wink: 

----------

## Kernel78

 *mouser wrote:*   

> Scusate, ma più semplicemente non basta mettere in /etc/profile e ~/.bashrc
> 
> ```
> alias rm="rm -i"
> ```
> ...

 

Se fai affidamento ad una soluzione del genere preparati ad una brutta sorpresa ...

imposta l'alias che suggerisci e se sei sicuro della tua soluzione dai un bellissimo rm -rf /

P.S. fallo solo se vuoi cancellare tutto  :Wink: 

----------

## zolar czakl

```
alias rm="rm -i --"
```

E' scomodo ma taglia la testa agli errori di distrazione.

Si puo' sempre aggiungere

```
alias rm_sono_sicuro_di_quello_che_faccio="/bin/rm -rf"
```

----------

## Kernel78

 *zolar czakl wrote:*   

> 
> 
> ```
> alias rm="rm -i --"
> ```
> ...

 

è molto scomodo, ti tagli via la possibilità di usare le altre opzioni ...

----------

## mouser

[edit]

Cancello quello che avevo scritto acidamente perchè in una brutta giornata.

Pensavo si riferisse a me, e non alla soluzione proposta successivamente

Ciriciao

mouser  :Wink: 

----------

## Kernel78

 *mouser wrote:*   

> [edit]
> 
> Cancello quello che avevo scritto acidamente perchè in una brutta giornata.
> 
> Pensavo si riferisse a me, e non alla soluzione proposta successivamente
> ...

 

Se ti interessa io ho commentato la tua soluzione in quanto non risolverebbe il problema ... (spero di averlo scritto senza essere acido  :Wink:  )

----------

## mouser

 *Kernel78 wrote:*   

> Se ti interessa io ho commentato la tua soluzione in quanto non risolverebbe il problema ... (spero di averlo scritto senza essere acido  )

 

Ma la mia soluzione non era

```
alias rm="rm -i --"
```

Questa effettivamente ti preclude la possibilità di utilizzare altre opzioni, mentre la mia soluzione

```
alias rm="rm -i"
```

Permette di usare anche tutte le altre opzioni che vuoi.

In ogni caso, aggiungendo l'opzione -f si genera un'entropia cosmica dissimulata che insieme alla distruzione del computer genera un buco nero cancellando parte dell'universo insieme ai file presenti nella directory.

Ciriciao

mouser  :Wink: 

----------

## Sasdo

signori, non temete, ci pensa il buon Sasdo a risolvere tutti i vostri problemi... sto finendo uno scrippettino che fa da wrapper all'rm: controlla tutti i file che si vogliono cancellare e si prosegue solo se non fanno match con una serie di regexp (ovviamente configurabili) e in tal caso chiede se si è sicuri di voler procedere, chiaramente però tutto questo implica un calo di prestazioni dovute ai controlli... però insomma.. piuttosto che niente... datemi ancora qualche giorno e lo posto.

ciaos  :Smile: 

----------

## randomaze

 *Sasdo wrote:*   

> chiaramente però tutto questo implica un calo di prestazioni dovute ai controlli...

 

Io aggiungerei anche un paio di sleep, in modo da scoraggiare ulteriormente l'uso dell'account di root per la "normale amministrazione"  :Rolling Eyes: 

----------

## mouser

 *randomaze wrote:*   

> Io aggiungerei anche un paio di sleep, in modo da scoraggiare ulteriormente l'uso dell'account di root per la "normale amministrazione" 

 

asdasdasd, parole sante

Ciriciao

mouser  :Wink: 

----------

## Sasdo

 *randomaze wrote:*   

>  *Sasdo wrote:*   chiaramente però tutto questo implica un calo di prestazioni dovute ai controlli... 
> 
> Io aggiungerei anche un paio di sleep, in modo da scoraggiare ulteriormente l'uso dell'account di root per la "normale amministrazione" 

 

ehehehe!!

----------

## GiRa

Secondo me una persona così abile da scrivere o configurare uno script così non ne avrà bisogno.

Chi fa la cazzata la farà comunque.

----------

## Sasdo

siori e siore ecco qua saferm:

```

#!/bin/bash

localConfig="$HOME/.safermrc"

globalConfig="/etc/saferm/config"

currentDir=$(pwd)

commandToWrap="rm"

arrayRegExp=

canExecute ()

{

        # per ogni "regola" nel configFile controllo se fa match con il parametro che sto analizzando ora.

        # se si allora NON posso cancellarlo e ritorno false, altrimenti ritorno true.

        count=0

        while [[ $count -lt ${#regExpArray[*]} ]]

        do

                # controllo se e' un percorso assoluto o no, se non lo e', aggiungo il path attuale.

                if [[ ! $(echo $1 | grep "^/") ]]

                then

                        file="$currentDir/$1"

                else

                        file=$1

                fi

        #       echo array value: ${regExpArray[$count]}

                regexp=${regExpArray[$count]}

                echo $file | grep -q "$regexp"

                # ho fatto match, forse e' meglio non proseguire...

                if [[ $? -eq 0 ]]

                then

                        echo "match con: $regexp"

                        return 0

                fi

                count=$((count + 1))

        done

        return 1

}

loadArrayFromFile ()

{

        if [[ -f $1 ]]

        then

                count=1

                arrayCount=${#regExpArray[*]}

                lines=$(wc -l $1 | cut -d \  -f 1)

                while [[ $count -le $lines ]]

                do

                        line=$(head -n $count $1 | tail -n 1)

                        regExpArray[$arrayCount]=$line

                        arrayCount=$((arrayCount + 1))

                        count=$((count + 1))

                done

        fi

}

stopCheckDashedArgs=0

optionList=

endOptions="--"

loadArrayFromFile $localConfig

loadArrayFromFile $globalConfig

while [[ ! -z $1 ]]

do

        case "$1" in

                "--")

                        stopCheckDashedArgs=1

                ;;

                "-*")

                        if [[ ! stopCheckDashedArgs ]]

                        then

                                optionList="$optionList $1"

                        else

                                endOptions="$endOptions $1"

                        fi

                ;;

                *)

                        cmd="$commandToWrap $optionList $1"

                        canExecute $1

                        if [[ $? -eq 1 ]]

                        then

                                #echo "eseguo il comando: $cmd"

                                $cmd

                        else

                                endLoop=0

                                while [[ $endLoop -eq 0 ]]

                                do

                                        echo "WARNING!!!! $cmd"

                                        echo "WARNING!!!! SI STA PER ESEGUIRE UN COMANDO POTENZIALMENTE PERICOLOSO!!! Sicuri di continuare? (Yes/No)"

                                        read answer

                                        if [[ $answer = "Yes" ]]

                                        then

                                                endLoop=1

                                                echo "Eseguo: $cmd"

                                                $cmd

                                        else

                                                if [[ $answer = "No" ]]

                                                then

                                                        endLoop=1

                                                        echo "Occhei, non eseguo quel comando"

                                                else

                                                        echo "Non ho capito la risposta, scrivi 'Yes' oppure 'No'"

                                                fi

                                        fi

                                done

                        fi

                ;;

        esac

        shift

done
```

come si usa:

1. copiate lo script in un file a vostro piacimento e date i permessi di esecuzione.

2. editate il vostro .bashrc e aggiungete l'alias:

```
alias rm="path/to/saferm"
```

3. editate un file `/.safermrc scrivendo in ogni linea una regexp, ad esempio:

```
^/etc.*$

^/var.*$

noncancellarequestofile.zip
```

Ricordate: una riga, una regexp. nessuna eccezione, nessun commento, niente linee vuote.

3 b) Si può anche usare un file di configurazione "globale", tale file è: /etc/saferm/config seguendo le medesime regole del punto 3.

Se sono presenti entrambi i file di configurazione, verranno letti entrambi e verranno controllati tutti i pattern (anche i doppi).

4. Per testare il tutto (ed evitare di fare danni in seguito), vi suggerisco di usare un comando "innocuo" come echo, ovvero editate la linea:

```
commandToWrap="rm"

in

commandToWrap="echo"
```

per fare tutte le vostre prove in sicurezza. Una volta che avete visto che le regexp che avete scritto sono funzionanti, potrete rimettere rm.

5. note finali: come ovvio, non mi ritengo assolutamente responsabile dell'uso incorretto di questo script ne della sua "infallibilità"... insomma... usate a vostro rischio e pericolo...

5 b) Dovendo controllare ogni file (nota: controlla i soli parametri passati ad rm, se fate quindi rm -r /etc verrà controllato solo "/etc") e dovendo eseguire un pattern matching su ogni entry, rallenta un po' le prestazioni.

6. Se pensate che questo script meriti di essere ampliato/migliorato/perfezionato/buttato via ecc ecc, non esitate a dirlo, postare modifiche o richiedetene. Se è un progetto che ritenete interessante si potrebbe in futuro scrivere un programmino in C che faccia da wrapper di rm in modo da essere più performante di uno script.

fatemi sapere.

ciaos!

----------

## thewally

Ottimo.

Appena ho un attimo "ci do una testata"   :Laughing: 

Se funge posso finalmente darmi alla rimozione pazza   :Very Happy: 

----------

