Dominique Meeùs
Dernière modification le   
retour à la table des matières — à l’index — à ma page de départ

Propriétaires et permissions de fichiers

On change de propriétaire par la commande chown. Exemple :

chown owner:group fichier
chown -R owner:group répertoire

(-R pour les sous-répertoires).

On attribue les permissions par la commande chmod.

Mon problème est que, dans diverses manipulations d’une installation à l’autre, d’une partition à l’autre et d’un propriétaire à l’autre (surtout en recopiant des fichiers d’une partition FAT, par exemple d’un stick USB), de nombreux documents ont reçu la permission d’exécution. (Si on double-clique un document soi-disant exécutable, on doit choisir si on veut le lancer ou l’afficher. C’est chiant.) Je veux retirer cette permission globalement. Example à ne pas suivre :

chmod -R u=rw,g=r,o= *

en effet, cette commande s’appplique aussi aux sous-répertoires et à leurs fichiers (-R). Elle leur donne uniquement (=) lire et écrire pour user, lire pour group et rien pour others. (Avec + on ajouterait des permissions aux permissions existantes, avec - on retirerait des permissions.) C’est mauvais parce que la permission x est retirée aux sous-répertoires qui en deviennent inaccessibles. (Du coup, les fichiers qu’ils contiennent ne sont même pas traités.) Mieux (attention, avec X majuscule) :

chmod -R u=rwX,g=rX,o= *

Cela répare les dégâts causés par la commande précédente : cela rétablit l’accès aux répertoires, mais rend aussi exécutables tous les fichiers qui l’étaient déjà pour qui que ce soit. Cette commande ne convient donc pas pour retirer la permission d’exécution aux documents. Pour assurer un traitement différent aux répertoires et aux fichiers, il semble que l’on doive passer par find en jouant sur le type d ou f. On doit écrire deux commandes séparées comme :

find /home/archives -type d -exec chmod u=rwx,g=rx,o= {} \;

pour les dossiers et

find /home/archives -type f -exec chmod u=rw,g=r,o= {} \;

pour les fichiers. (Attention, pas d’espaces derrière les virgules. Une expression telle que u=rwx,g=rx,o= doit être d’un seul tenant.)

Dans ces expressions, find cherche tous les répertoires (-type d) — respectivement les fichiers ordinaires (-type f) — et exécute (-exec) la suite de l’expression terminée par \;. Dans cette suite, chmod attribue les permissions (indiquées) à {} qui repésente le nom du fichier trouvé par find. Non seulement, c’est une jolie expression, mais ça marche et ça donne le résultat que je voulais.

Peut se poser alors le problème de rendre des scripts exécutables. J’écris mes scipts Bash avec un nom de fichier sans extension (sans .sh et cetera). Je ne peux donc pas chercher *.sh. Par contre, je peux chercher #! ou /bin/. (Bash n’aime pas grep -F "#!/bin/". Par ailleurs je ne cherche pas /bin/bash parce que je pourrais avoir des scripts à exécuter avec autre chose.) Autre problème, chmod ne lit pas l’entrée standard. On peut cependant lui donner comme entrée une commande entre caractères ` `. Je peux donc rendre exécutables les fichiers contenant /bin/ en commandant chmod u=rwx,g=rx,o=rx `grep -Fl "/bin/" *`. Finalement, si je veux passer dans les sous répertoires, ça devient :

chmod u=rwx,g=rx,o=rx `grep -rFl "/bin/" . --include="*"`

L'ennui, c'est que ça ne marche pas sur des chemins qui contiennent des espaces. Ça donnerait des pages HTML exécutables parce que parlant de « /bin/ ». (Comme celle-ci.) On peut chercher les exécutables (et vérifier par là qu’on n’en a pas trop) par find -executable -type f.

Dominique Meeùs . Date: 2011… 2017