Hat shutil Probleme mit Linux-Permissions?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo zusammen,

ich habe hier ein Szenario, in dem ich - für meinen Auto-Updater - Dateien vom Home-Verzeichnis nach /usr/share/apps/PROGRAMMNAME kopieren möchte. Um dies zu ermöglichen, wird besagtes Verzeichnis nach der Installation mit 0777 chmodded - nicht optimal aber für Testzwecke ok.

Nun scheiter das Kopieren mit shutil dorthin grundsätzlich. An anderer Stelle im Forum wurde schon ein Problem mit Copytree benannt: Dies versucht das Zielverzeichnis anzulegen - ist dies schon vorhanden, kommt es zu einem Fehler. Meines Erachtens ist das schon ein großes Problem, da dies den Benutzer zwingt, das entsprechende Verzeichnis vorher rekursiv mit shutil.rmtree() zu löschen - wirklich alles andere als eine gute Lösung.
Gut, also habe ich die entsprechende Methode etwas abgeändert.

Nun aber das eigentliche Problem: Auch das Kopieren / Verschieben ganz gewöhnlicher Dateien nach /usr/share/apps/PROGRAMMNAME scheitert, obwohl die Unix-Permissions das Schreiben für Jedermann erlauben.
Grund: copy, copy2 und move rufen nach dem Kopier- / Verschiebevorgang shutil.copymode() auf, das die Benutzerberechtigungen kopiert. D.h. nicht das Kopieren selbst sondern das Setzen der Berechtigungen verursacht diesen Fehler. In der Folge aber scheint shutil völlig unfähig, in Verzeichnisse zu kopieren, wenn diese nicht explizit dem kopierenden Benutzer gehören.

Kurz: Kann es sein, dass shutil nicht wirklich mit Permissions unter Unix umgehen kann? Oder ist meine Annahme falsch und das Kopieren *soll* im beschriebenen Fall gar nicht funktionieren?

Gruß,

Daniel

//edit:
Anbei ein kleines Script, dass die Problematik verdeutlicht (hoffentlich):

Code: Alles auswählen

#!/bin/sh

if [ $0 != "example.sh" ]
    then echo "Please name me 'example.sh'"
    exit
fi

echo "Permission issue example"
echo ""

echo "Will now create folder and a file with root permissions and chmod 0777 it:"

sudo mkdir test_persmission_example
sudo touch test_persmission_example/example_copy.sh
sudo chmod -R 0777 "test_persmission_example"

echo "Will now create a python file which will try to copy this file to the newly created folder:"

echo "#!/usr/bin/env python" > permission_example.py
echo "print('Hi, i am a python script')" >> permission_example.py
echo "import shutil" >> permission_example.py
echo "print shutil.copy('example.sh', 'test_persmission_example/example_copy.sh')"  >> permission_example.py

echo "Please hit enter to run that python file"
echo "This action will most probably fail"
read input
python permission_example.py
Das sh Script erstellt mit Root-Rechten einen Test-Ordner mit einer Datei darin, und chmodded beides mit 0777. Dann erstellt es ein Python-Script, dass das sh-Script in den Test-Ordner kopieren soll.

Da dieses Python-Script nur mit Benutzerrechten läuft, wird es in der Regel zu einem Fehler kommen, wenn es versucht, die erstellte Datei zu chmodden - was bei shutil anscheinend Standard Verfahrensweise ist.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Die Datei gehört dir nun einmal nicht, deshalb darfst du keine Rechte einfach so setzen. Du könntest die Datei vorher löschen oder einfach `shutil.copyfile()` nehmen.

Und "nicht optimal" ist ja wohl ein Euphemismus.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

ja klar, die Ursache des Problems ist mir schon klar. Es ging nur darum, dass ich nicht erwarte, dass die Rechte gesetzt werden - zumal sich dies ja mir copystat oder ähnlichem ohne weiteres bewekstelligen ließe.
So ist die Funktion copytree() für mich wertlos und ich muss sie neu implementieren.

Letztlich war die Frage also, ob das Setzen der Berechtigung "standard" ist - ich hatte irgendwie den Eindruck, dass das eben nicht der Fall ist: Wenn ich unter Linux eine Datei kopiere, werden die Berechtigungen ja auch nicht gesetzt - dafür muss ich zusätzlich den Parameter "-p" benutzen.

betreffs "nicht optimal":
Ja, sowas nennt man einen Euphemismus ;)
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Naja, ob erwartet oder unerwartet: Zumindest in der Dokumentation steht es, dass es sich so verhält. Aber warum nicht einfach die entsprechenden Rechte beim Starten des Programms voraussetzen, anstatt irgendeine unschöne Lösung zusammenzufrickeln?
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

weil ich ein automatisches Update implementieren möchte und den User nicht zwingen kann / will mein Programm immer als Root laufen zu lassen.

//edit: Außerdem ist es wohl kaum eine unschöne Lösung, aus bestehendem Code (wie shutil.copytree und shutil.copy) diejenigen Zusatzfunktionen heraus zu nehmen, die ich nicht benötige.

Wie auch immer, ich weise den Benutzer jetzt einfach darauf hin, dass seine Rechte nicht reichen und er das Programmverzeichnis in seinen Besitz chownen soll.
Antworten