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
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.