Récemment, j'utilise le module Python os, lorsque j'ai essayé de modifier l'autorisation d'un fichier, je n'ai pas obtenu le résultat attendu. Par exemple, j'avais l'intention de changer l'autorisation en rw-rw-r--,
os.chmod("/tmp/test_file", 664)
L'autorisation de propriété est en fait -w - wx --- (230)
--w--wx--- 1 ag ag 0 Mar 25 05:45 test_file
Cependant, si je change 664 en 0664 dans le code, le résultat est exactement ce dont j'ai besoin, par exemple
os.chmod("/tmp/test_file", 0664)
Le résultat est:
-rw-rw-r-- 1 ag ag 0 Mar 25 05:55 test_file
Quelqu'un pourrait-il aider à expliquer pourquoi ce 0 en tête est si important pour obtenir le résultat correct?
python
file
permissions
chmod
AplusG
la source
la source
Réponses:
J'ai trouvé ça sur un autre forum
Ce que vous faites est de passer
664
ce qui en octal est1230
Dans votre cas, vous auriez besoin
[Mise à jour] Remarque, pour Python 3, vous avez le préfixe avec 0o (zéro oh). PAR EXEMPLE,
0o666
la source
1
n'est pas écarté! C'est le bit sticky / setuid / setgid, et 1 signifiesticky
. En utilisant,ls -l
vous remarquerez peut-être que les autorisations incluent désormais unT
à la fin ...Donc, pour les personnes qui veulent une sémantique similaire à:
Utilisation:
Si votre Python est plus ancien que 2.6:
la source
00755
Cela devrait probablement être le cas , juste pour préciser où vont les bits suid / sgid / sticky, au cas où un développeur plus tardif viendrait et voudrait utiliser cet ancien script, par exemple, sgid avec2755
mais ne peut pas comprendre pourquoi les permanentes sont complètement foutues. ;)en tête
0
signifie qu'il s'agit d'une constante octale , pas d'une décimale. et vous avez besoin d'un octal pour changer de mode de fichier.les autorisations sont un masque de bits, par exemple,
rwxrwx---
sont111111000
en binaire, et il est très facile de grouper les bits par 3 pour les convertir en octal, que de calculer la représentation décimale.0644
(octal) est0.110.100.100
en binaire (j'ai ajouté des points pour la lisibilité), ou, comme vous pouvez le calculer,420
en décimal.la source
Utilisez des symboles d'autorisation au lieu de chiffres
Votre problème aurait été évité si vous aviez utilisé les symboles d'autorisation plus sémantiquement nommés plutôt que les nombres magiques bruts, par exemple pour
664
:Ceci est documenté sur https://docs.python.org/3/library/os.html#os.chmod et les noms sont les mêmes que les valeurs de l' API C POSIX documentées sur
man 2 stat
.Un autre avantage est la plus grande portabilité comme mentionné dans la documentation:
chmod +x
est démontré à: Comment faire un simple "chmod + x" depuis Python?Testé dans Ubuntu 16.04, Python 3.5.2.
la source
Si vous avez les autorisations souhaitées enregistrées dans la chaîne, faites
la source
Utiliser les masques stat. * Bit me semble la manière la plus portable et la plus explicite de le faire. Mais d'un autre côté, j'oublie souvent la meilleure façon de gérer cela. Donc, voici un exemple de masquage des autorisations «groupe» et «autres» et de laisser les autorisations «propriétaire» intactes. L'utilisation de masques et de soustractions est un modèle utile.
la source