Eigenarten der BASH umschiffen

Die chown-Falle

| Autor: Thomas Drilling

Drillings Open-Source-Eck
Drillings Open-Source-Eck (Bild: Thomas Drilling)

Sind Sie Entwickler und arbeiten daher häufig mit root-Rechten? Für Web-Entwickler ein durchaus nicht unübliches Szenario. Dann dürfte Ihnen auch das Unix-Kommando chown geläufig sein. Achten Sie aber auf die richtige Verwendung.

Sind Sie z. B. als Web-Entwickler unterwegs und haben das Problem, dass der User-Account mit dem der Webserver ausgeführt wird einzelne Dateien nicht anlegen oder löschen kann, greifen Sie wahrscheinlich auch zu chown.

Mit chown lässt sich bekanntlich der Eigentümer einer Datei oder eines Verzeichnisses ändern. Doch Vorsicht:

Angenommen sich möchten den Besitzer aller Dateien und Unterverzeichnisses im aktuellen Verzeichnis in „www-data“ rekursiv ändern, sollten Sie dafür NICHT

chown -R www-data *

benutzen, wobei „www-data“ der neue Eigentümer ist.

Dies bewirkt zwar auf dem ersten Blick durchaus, dass sämtliche Dateien und Unterverzeichnisse erfasst werden, auf dem zweiten Blick werden Sie aber feststellen, dass versteckte Dateien (die mit dem vorangestellten Punkt) fehlen.

Dies wiederum liegt daran, dass der Befehl doch nicht so wirkt wie man vermuten würde, bzw. eigentlich genauso wie er definiert ist. Das Kommando wird nur in diesem Fall missverständlich angewendet. Meist funktioniert es ja auch. Dass versteckte Dateien nicht erfasst werden,  fällt oft erst später auf.

Wildcard Expansion

„Schuld“ ist in diesem Fall die Wildcard Expansion der Bash. Die macht nämlich aus dem Asterisk zunächst eine Liste aller Dateien und Unterverzeichnisse im aktuellen Verzeichnis und übergibt sie erst dann an das chown- Kommando. Leider unterdrückt die Expansion aber auch die versteckten Dateien, wie z. B. „.htaccess“ oder das Verzeichnis „.svn“.

Seltsam aber ist dass das Kommando „innerhalb“ von Unterverzeichnissen doch wieder korrekt zu funktionieren scheint und versteckte Dateien durchaus erfasst. Dies liegt dran, dass sich chown bei einer Rekursion in Unterverzeichnissen zwangsläufig selbst um das vorherigen „Sichten“ der Dateien kümmert, wobei keine Shell-Mechanismus irgendetwas anzeigetechnisch unterdrückt.

Die Lösung ist daher viel einfacher als vermutet. Da  nämlich der Punkt „.“ In der Bash als Synoym für das aktuelle Verzeichnis gilt, verwendet man stattdessen …

chown -R www-data .

Hierbei kann die Wildcard-Expansion nicht wirken, die ja zunächst eine Liste der Dateien bilden würde, für die der Eigentümer zu ändern ist, weil die gewünschte Zielmenge hier mit dem „.“ eindeutig identifiziert ist.

Daher hilft es natürlich auch, dem Kommando das gewünschte Startverzeichnis explizit mitzugeben, etwa ....

chown -R www-data /var/www/<my-domain>