J'ai accidentellement chmod -R + x sur un répertoire. Comment restaurer les autorisations correctes?

20

Eh bien, pour être précis, ça l'était chmod -R 755. Maintenant, chaque fichier est exécutable, ce que je ne veux pas. Je pense que je devrais regarder les deux premiers octets de chaque fichier pour le #!, mais cela couvrira-t-il tout? Dois-je plutôt utiliser filepour tout regarder et baser ma décision sur cela? Ou, plus probablement, existe-t-il une meilleure façon de procéder?

Quelle est la meilleure façon de parcourir récursivement un répertoire et de définir -x sur des fichiers qui ne sont pas «censés être» exécutables?

Larry Wang
la source
L'avez-vous fait dans /ou dans un autre répertoire?
gvkv
1
@gvkv: Non /, un répertoire qui m'appartient entièrement.
Larry Wang
1
@Larry à l'avenir, vous devriez probablement utiliser une variante de + x plutôt que de violer toutes les autorisations, et éventuellement de provoquer des écritures sur tous les fichiers.
xenoterracide
@xenoterracide: D'accord. Ce que je voulais vraiment, c'était de donner au groupe les mêmes autorisations que moi (ce qui s'est finalement produit!), Je n'ai pas réfléchi suffisamment avant de taper.
Larry Wang
De combien de fichiers parle-t-on? Combien devraient être exécutables? Existe-t-il un moyen de distinguer les noms de fichiers?
David Thornley

Réponses:

15

Il n'y a pas de solution miracle ici. Les autorisations contiennent des informations qui ne sont pas toujours redondantes.

Si vous aviez fait cela dans un répertoire système, votre système serait dans un très mauvais état, car vous devriez vous soucier des bits setuid et setgid, et des fichiers qui ne sont pas censés être lisibles par le monde, et des fichiers qui sont censés être inscriptibles en groupe ou dans le monde.

Dans un répertoire par utilisateur, vous devez vous soucier des fichiers qui ne sont pas censés être lisibles par le monde. Personne ne peut vous y aider.

En ce qui concerne l'exécutabilité, une bonne règle de base serait de faire en sorte que tout ce qui ne semble pas pouvoir être exécuté soit non exécutable. Le noyau peut exécuter des scripts dont les deux premiers octets sont #!, des binaires ELF dont les quatre premiers octets sont \x7fELF\x7fest l'octet avec la valeur 12, et quelques types de fichiers plus rares (a.out, tout ce qui est enregistré avec binfmt_misc). Par conséquent, la commande suivante devrait restaurer vos autorisations dans un état raisonnable (suppose que bash 4 ou zsh, sinon utilisez findpour parcourir l'arborescence de répertoires; avertissement, tapé directement dans le navigateur):

for x in **/*; do
  if ! [ -f "$x" ]; then continue; fi # skip all but regular files
  case $(head -c 4 "$x") in
    "#!"??) :;; # skip script
    "\x7fELF") :;; # skip ELF executable
    *) chmod a-x "$x";;
  esac
done

Notez qu'il existe un moyen simple de sauvegarder et de restaurer les autorisations d'une arborescence de répertoires, sous Linux et éventuellement d'autres unités avec prise en charge ACL:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions
Gilles 'SO- arrête d'être méchant'
la source
Merci! Heureusement, je pense que tout tombe dans ces deux catégories. Si cela manque quelque chose, je pourrai m'en occuper plus tard.
Larry Wang
Gardez à l'esprit que cela **/*nécessite globstar.
Chris Down
Je recommanderais deux modifications à ce script. Premièrement, utilisez findplutôt que globstar; deux, au lieu de regarder la tête, utilisez la filecommande pour voir ce que c'est et branchez-vous à partir de là.
Shadur
@Shadur findest moins fiable que globstar, globstarest préférable dans presque tous les cas.
Chris Down
1
@Gilles Prefable comme dans "si vous l'avez, il est de loin supérieur", non seulement il est plus rapide, mais il est également plus fiable (et n'a pas de SNAFU inattendus).
Chris Down
6

Je crois que tu voudras quelque chose comme

find dir -type f -exec chmod ugo-x '{}' +

Cela recherche tous les fichiers normaux, récursivement dans dir, (il exclut les répertoires et les périphériques) et supprime le bit exécutable.

Je commencerais ici, puis je ferais mon chemin vers la création de fichiers censés être exécutables, exécutables.

Ce qui suit devrait fonctionner exactement comme vous l'avez demandé (il trouvera tous les fichiers normaux, les grep pour #! Puis supprimera les x bits s'ils ne sont pas trouvés)

find . -type f | xargs grep -L #! | xargs chmod ugo-x

éventuellement une meilleure version de ce qui précède (moins de tuyaux)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 
xénoterracide
la source
3
Faites cela grep -L '^#!'au moins (les guillemets sont nécessaires et se ^limitent à la correspondance au début de la ligne), mais c'est toujours trop permissif car il correspond #!sur n'importe quelle ligne. L'utilisation xargséchouera avec les noms de fichiers contenant des espaces ou des guillemets; utiliser xargs -d '\n'(nécessite GNU xargs).
Gilles 'SO- arrête d'être méchant'
0

Eh bien, sans ligne de shebang, le fichier sera exécuté comme un script shell, nominalement avec /bin/sh. Vous pensez que c'est un bon début et en supposant que le répertoire en question ne contient pas de fichiers critiques, il n'y a probablement pas beaucoup de risques pour en exécuter certains grepet chmodcombo. Vous pouvez rencontrer des faux positifs, c'est-à-dire des fichiers avec une ligne shebang qui ne sont pas censés avoir leur bit exécutable défini mais sans connaître plus d'informations sur le but de ce qui est dans le répertoire, vous seul pouvez décider si cela représente une menace existentielle importante pour votre système et / ou des données.

gvkv
la source
Je ne m'inquiète pas tant des faux positifs que des faux négatifs. Il y a des binaires avec lesquels je ne pense pas commencer #!.
Larry Wang