# Linux allgemein: wie schütz man ein dir vor rm -r?

## mwahl

Hallo,

ich habe folgendes Problem:

Ich möchte ein portage-snapshot in /usr/portage extrahieren. Dabei muss ich natürlich vorher alle alten Files löschen, damit die manifest und digest Infos richtig sind. Also vorher ein

```
cd /usr/portage

rm -r *
```

Leider geht dabei auch das distfiles directory mit drauf. Ein 

```
chmod a-w distfiles
```

 scheint wirkungslos. Das rm -r löscht das directory trotzdem.

Frage 1: Was ist die geschickteste Methode für mein Problem?

Frage 2: Was bedeutet -w bei directories oder warum wird es nicht beachtet?

----------

## misterjack

wozu portage snapshot extrahieren, wenn es doch emerge --sync gibt? ansonsten einfach mal kurz distfiles woanders hin verschieben und dann wieder zurück. oder verschiebst das dauerhaft nach /usr z.b. und gibst dann in der make.conf DISTDIR="/usr/disfiles/" an

----------

## mwahl

 *misterjack wrote:*   

> wozu portage snapshot extrahieren, wenn es doch emerge --sync gibt? 

 

Seit kernel 2.6.16 funktioniert mein linmodem nicht mehr und habe zuhause kein DSL - lebe sozusagen Gentoo-offline mit all den kleinen Problemen.

 *misterjack wrote:*   

> ansonsten einfach mal kurz distfiles woanders hin verschieben und dann wieder zurück. oder verschiebst das dauerhaft nach /usr z.b. und gibst dann in der make.conf DISTDIR="/usr/disfiles/" an

 

Ist eine gute Idee und habe ich bisher auch so gemacht. Allerdings interessiert mich mehr das allg. Fileattribute-Konzept bei Linux. Kann es daran liegen, dass ich beim rm -r als root eingelogt bin und dann das o-w des owners(root) nicht beachtet wird?

----------

## Finswimmer

Prinzipiell geht auch sowas:

rm `ls -1|grep distfiles -v` Damit gibt er eine Liste aller Inhalte außer distfiles aus.

Ansonsten: Du Bist Root, darfst also jede Datei ändern, dementsprechend auch löschen. -R ist rekursiv, also killst du damit alles.

Verhindern kannst du das nicht.

Tobi

----------

## Anarcho

man chattr

----------

## think4urs11

 *mwahl wrote:*   

> Frage 1: Was ist die geschickteste Methode für mein Problem?

 

Du könntest ganz einfach dein distfiles-Verzeichnis irgendwo anders hinpacken als in den default /usr/portage/distfiles

($DISTDIR in /etc/make.conf)

Oder die Methode für Masochisten:

in ~/.bashrc: alias rm='rm -i'

----------

## schachti

 *Think4UrS11 wrote:*   

> 
> 
> Oder die Methode für Masochisten:
> 
> in ~/.bashrc: alias rm='rm -i'
> ...

 

Dann oute ich mich als Masochist - das ist das erste, was ich auf einem neuen System mache.  :Wink: 

Bringt allerdings auch nichts, wenn man aus Versehen rm -rf * macht.   :Laughing: 

----------

## hoschi

Read Mail Really Fast  :Very Happy: 

----------

## mwahl

 *Finswimmer wrote:*   

> Ansonsten: Du Bist Root, darfst also jede Datei ändern, dementsprechend auch löschen. 

 

Ich vermute auch, dass es daran liegt: root darf ALLES.

Szenario: owner eines Verzeichnisses setzt sein eigenes write-flag auf -w.

Was passiert bei einem rm -r * in dem parent directory? Vermutlich werden alle bis auf das eine gelöscht.

Wenn root der owner und ebenfalls das w flag nicht gesetzt hat, sollte er eigentlich dieses directory nicht löschen können. Aber root ist der superuser und ich glaube mich zu erinnern das bei all diesen Sicherheitschecks von Linux am Ende so eine Art

```
isSuperuser()
```

 aufgerufen wird. Falls ja wird die Aktion erlaubt.

----------

## think4urs11

 *schachti wrote:*   

> Bringt allerdings auch nichts, wenn man aus Versehen rm -rf * macht.  

 

Gnaaaah   :Wink: 

Ok, für die ganz harten - grundsätzlich immer alles auf WORM-Medien schreiben   :Twisted Evil: 

----------

## Fauli

 *mwahl wrote:*   

> Frage 1: Was ist die geschickteste Methode für mein Problem?

 

```
rm -r !(distfiles)
```

----------

## STiGMaTa_ch

Im uebrigen kann man auch in "wichtigen" Verzeichnissen eine Datei namens -i erzeugen. Wenn man sich dann in dem Verzeichnis befindet und aus Versehen ein rm -r * eingibt wird durch das File -i auomatisch ein rm -ri * daraus.

Bsp:

```
cd /

touch -- -i
```

Ein rm -r * in / sorgt nun nicht mehr für ungewollte Ueberraschungen.

Loeschen kann man das File uebrigens wieder so:

```
rm -- -i
```

Lieber Gruss

STiGMaTa

----------

## hoschi

Oh, davon habe ich mal in Gentoo-Wiki gelesen. Wenn man jemand wirkilch aergen will, legt man ein paar solcher Dateien an  :Very Happy: 

----------

## Genone

 *mwahl wrote:*   

> Frage 2: Was bedeutet -w bei directories oder warum wird es nicht beachtet?

 

 *info coreutils wrote:*   

> There are three kinds of permissions that a user can have for a file:
> 
>   1. permission to read the file.  For directories, this means
> 
>      permission to list the contents of the directory.
> ...

 

Oder anders ausgedrückt: Die Rechte einer Datei sind beim Löschen schnurzegal, die Rechte des übergeordneten Verzeichnisses sind da relevant.

----------

## l3u

Aber das mit der "-i"-Datei ist ja  cool :-) Funktioniert aber leider nicht, wenn man ein Verzeichnis _unter_ dem ist, in dem -i ist. Heißt: Wenn in ~/blubb die Datei -i ist, dann kann ich in ~ trotzdem rm -r blubb eingeben, ohne daß was gefragt wird.

----------

## gentop

 *Fauli wrote:*   

> 
> 
> ```
> rm -r !(distfiles)
> ```
> ...

 

```
bash: !: event not found
```

?

//gentop

----------

## mwahl

Hätte nicht gedacht, dass ich damit so ne Diskussion auslöse.

 *info coreutils wrote:*   

> 
> 
>   2. permission to write to (change) the file.  For directories, this
> 
>      means permission to create and remove files in the directory.
> ...

 

Probiert mal aus was passiert wenn ihr als normaler user folgende Verzeichnisstruktur anlegt:

```

mkdir test

mkdir test/a

mkdir test/b

cd test

chmod a-w b

rm -r *

```

Kommt da bei euch auch ne Frage im Stil von: Soll das write-protected Directory gelöscht werden? Verzeichnis a wird anstandslos gelöscht.

Und jetzt macht das Spielchen nochmal als root.

Wenn ich wieder vor meinem Rechner sitzte versuche ich eure Tricks mal. Vielen Dank.

----------

## l3u

@gentop: Ohne das jetzt ausprobiert zu haben: ein ! mußt du glaub ich escapen, also \!

----------

## Fauli

 *gentop wrote:*   

>  *Fauli wrote:*   
> 
> ```
> rm -r !(distfiles)
> ```
> ...

 

Du musst diese Funktion wahrscheinlich noch mit "shopt -s extglob" einschalten (praktischerweise auch in der ~/.bashrc).

Mir war nicht bewusst, dass extglob nur dann standardmäßig gesetzt ist, wenn man die bash-completion nutzt.

----------

## l3u

Äh, also irgendwie is das grad suspekt mit dem AUsrufezeichen. Ich hab mal a bissl rumprobiert, weil ich bei echo auch schon öfter das Problem mit "Event not found" hatte:

```
tobias@erhome ~ $ echo "Servus"

Servus

tobias@erhome ~ $ echo "Servus!"

echo "Servus" > tan_gk.asc

tobias@erhome ~ $
```

Ich hab vor kurzem (zu Testzwecken) sowas gemacht wie

```
echo "123456" > tan_gk.asc

echo "234567" >> tan_gk.asc
```

und so weiter ... aber warum wird jetzt bei 'echo "Servus!"' 'echo "Servus" > tan_gk.asc' ausgeführt?!

----------

## MatzeOne

Ich hab für /usr/portage/distfiles eine eigene Partition. Ich würde mir mit einem umount also helfen ;D

----------

## l3u

Das geht aber am Ziel vorbei, weil's ja um Grundsätze geht ...

----------

