Dominique Meeùs
Dernière modification le
retour à la table des matières
— à l’index
— à ma page de départ
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
.