Comment supprimer de manière récursive les autorisations d'exécution des fichiers sans toucher aux dossiers?

42

J'ai fait une sauvegarde sur un disque NTFS, et bien, cette sauvegarde s'est avérée vraiment nécessaire. Cependant, le lecteur NTFS a gâché les autorisations. Je voudrais les restaurer à la normale sans réparation manuelle de chaque fichier.

Un problème est que soudainement tous mes fichiers texte obtenus exécutent des autorisations, ce qui est faux ofc. Alors j'ai essayé:

sudo chmod -R a-x folder\ with\ restored\ backup/

Mais c'est faux car cela supprime également la xpermission des répertoires, ce qui les rend illisibles.

Quelle est la commande correcte dans ce cas?

Gaazkam
la source
1
Meta: Je n'ai jamais compris pourquoi les systèmes Unix ajoutaient le bit d'exécution aux fichiers montés à partir de systèmes de fichiers DOS ou Windows. Ce n'est pas comme si quiconque allait exécuter ces fichiers. J'ajoute généralement "noexec" à mes options de montage lorsque cela est pratique.
Edward Falk

Réponses:

70
chmod -R -x+X *

Les -xsupprime les autorisations d' exécution pour tous
Les +Xajouteront des autorisations d' exécution pour tous, mais seulement pour les répertoires.

Jak Gibb
la source
2
La commande que j'ai finalement utilisée pour restaurer les autorisations normales: `chmod -R a-x + X, u-x + rwX, go-wx + rX répertoire / nom`
gaazkam le
3
Voir aussi la réponse d'Edward à propos de l'exception pour BSD
mardi
4
Cela échoue avec l'exigence "sans toucher aux dossiers". Que faire si execute (peut-être pour world) a été supprimé intentionnellement sur certains répertoires? Vous ne devriez pas l'ajouter.
Ben Voigt
4
cela n'a pas fonctionné sur Mac. En déplaçant le drapeau -R au début, cela fonctionnera à la fois sur les terminaux Linux et Mac. chmod -R -x+x *
JoeMoe1984
2
En fait, avec le bon ordre, il fonctionne sous OSX, mais il n’a pas l’effet souhaité. Vous devez le faire en deux étapes distinctes:chmod -R -x * && chmod -R +X *
Timmmm 10/10
14

Ok, j'ai relu les pages de manuel "chmod" pour Mac OS X, BSD et Linux, et ai fait quelques expériences. Voici ce que j'ai appris sur les modes symboliques. Cela peut devenir compliqué, mais cela vaut la peine de comprendre:

  • La forme générale est clause [, clause …] où:
  • clause : = [ugoa] [+ - =] [rwxXstugo]
  • [ugoa] ( who ) (spécifiez multiple) signifie que vous définissez les droits d’utilisateur, de groupe, d’autre ou de tous. Si non spécifié, la valeur par défaut est 'a', mais umask est en vigueur.
  • [+ - =] ( action ) (en spécifier un) signifie:
    • + signifie ajouter les autorisations spécifiées aux autorisations déjà en vigueur
    • - signifie supprimer les autorisations spécifiées des autorisations déjà en vigueur
    • = signifie définir les autorisations sur les autorisations spécifiées, en effaçant toutes les autres
  • [rwxXstugo] ( permission ) (spécifiez plusieurs rwxXst ou un ugo) définit les autorisations pour le ou les utilisateurs spécifiés comme suit:
    • r - lire
    • w - écrire
    • x - exécuter / rechercher
    • X - exécuter / rechercher dans le répertoire OU n'importe quel bit d'exécution a déjà été défini.
    • s - suid ou sgid
    • t - collant
    • u - copier l'autorisation de l'utilisateur
    • g - copier l'autorisation du groupe
    • o - copier une autre permission

Ainsi, par exemple, a+xrendrait un fichier exécutable par tout le monde. a+Xferait un fichier exécutable par tout le monde SI il avait été exécutable par n'importe qui.

a+xrendrait un répertoire consultable par tout le monde. a+Xrendrait également un répertoire consultable par tout le monde.

La principale différence entre BSD et Linux réside dans le fait qu’avec BSD, la détermination est effectuée en fonction des autorisations du fichier avant l’ exécution de chmod. Sous Linux, la détermination est faite immédiatement avant que la clause + X soit exécutée.

Ainsi, avec BSD, la combinaison a-x,a+Xsupprime les droits d’exécution / de recherche, puis permet à tout le monde de rechercher un répertoire, et rend un fichier exécutable par tout le monde s’il avait été à l’origine exécutable par qui que ce soit.

Avec Linux, a-x,a+Xsupprimerait l’autorisation d’exécution / recherche, puis rendrait un répertoire accessible à tous, tout en laissant un fichier exécutable par personne.


Voici un exemple concret: sur une machine BSD: un répertoire, un fichier exécutable et un fichier non exécutable:

drwxr-x---  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x---  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

Notez que le répertoire et "fie" sont tous deux exécutables / consultables par l'utilisateur, mais pas par les autres.

Maintenant nous exécutons chmod a-x,a+X *. La première clause supprime le bit execute / search de tous les utilisateurs pour tous les fichiers, mais la seconde clause le rajoute à la fois pour "fee" et "fie". "fee" parce que c'est un répertoire et "fie" parce qu'il avait au moins un bit exécutable pour commencer.

drwxr-x--x  2 falk  staff  68 Jul 19 18:01 fee/
-rwxr-x--x  1 falk  staff   0 Jul 19 18:01 fie*
-rw-r-----  1 falk  staff   0 Jul 19 18:01 foe

J'ai eu le même résultat en exécutant chmod -x+X.

Conclusion: la solution de Jak Gibb fonctionnera sous Linux, mais pour BSD, vous devrez effectuer deux passages.

Je n'ai pas testé cela sur SVr4 ou d'autres variantes d'Unix.

Edward Falk
la source
Bonne lecture. Merci d'avoir fait des recherches à ce sujet.
Jak Gibb
10

Une façon de le faire:

find backup -type f -exec chmod 0644 {} +
Satō Katsura
la source
6
Cela pourrait entraîner l'ajout ou la suppression d'autorisations que vous ne souhaitiez pas modifier. Mieux vaut utiliserchmod a-x {}
Edward Falk le
1
@ EdwardFalk chmod a-x {}pourrait également finir par supprimer les autorisations que vous ne souhaitiez pas modifier et laisser des fichiers accessibles en écriture. Le fait est que 0644 est un compromis "généralement raisonnable". Bien entendu, le PO devrait également engager le cerveau avant d’appliquer des solutions d’Internet sur son ordinateur.
Satō Katsura
4
"ax" supprime les autorisations d'exécution pour l'utilisateur, le groupe, les autres et laisse les autres autorisations inchangées, pour autant que je sache. Est-ce que je me trompe?
Edward Falk
1
@ EdwardFalk Non, vous avez raison. Mais vous ne savez pas ce qu'est réellement l'ensemble de fichiers et vous ne savez pas non plus quelles sont les autorisations chmod. Si les fichiers de sauvegarde contiennent des scripts et des fichiers binaires, leur suppression xest incorrecte. Si les autorisations précédentes chmodsont 0777, elles chmod a-xresteront toujours 0666, ce qui n'est probablement pas ce que vous souhaitez. Ce que je dis, c’est que chmod 0644c’est une meilleure méthode heuristique, mais ce chmod a-xn’est pas faux.
Satō Katsura
1
@ NajibIdrissi Sauf quand, vous savez, ils sont passés à 0777 lorsque vous les avez copiés sur un système de fichiers étranger ne disposant pas d'autorisations UNIX. C'est exactement ce que l'OP a fait.
Satō Katsura
6
 find backup ! -type l ! -type d -exec chmod a-x {} +

Supprime l'autorisation d'exécuter des fichiers qui ne sont pas de type répertoire (comme vous l'avez demandé) ni lien symbolique (les liens symboliques sont généralement toujours rwxrwxrwx et chmodpourraient affecter la cible du lien symbolique sur eux).

Notez que:

 find backup -type f -exec chmod a-x {} +

ne changerait que la permission des fichiers normaux . Cela exclurait les répertoires et les liens symboliques , mais également les périphériques , les canaux nommés , les sockets et éventuellement d’autres selon le système (bien que dans le cas d’une sauvegarde d’un système de fichiers NTFS, il est peu probable que ceux-ci soient présents).

Stéphane Chazelas
la source
2

Dans zsh, utilisez le qualificatif glob . pour ne faire correspondre que les fichiers normaux (sans inclure les liens symboliques), et Dpour faire correspondre les fichiers point:

sudo chmod a-x folder\ with\ restored\ backup/**/*(D.)

Si la ligne de commande est trop longue, vous pouvez utiliser zargs:

zargs -- folder\ with\ restored\ backup/**/*(D.) -- sudo chmod a-x 
Gilles, arrête de faire le mal
la source