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 file
pour 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?
permissions
files
chmod
Larry Wang
la source
la source
/
ou dans un autre répertoire?/
, un répertoire qui m'appartient entièrement.Réponses:
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
où\x7f
est l'octet avec la valeur 12, et quelques types de fichiers plus rares (a.out, tout ce qui est enregistré avecbinfmt_misc
). Par conséquent, la commande suivante devrait restaurer vos autorisations dans un état raisonnable (suppose que bash 4 ou zsh, sinon utilisezfind
pour parcourir l'arborescence de répertoires; avertissement, tapé directement dans le navigateur):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:
la source
**/*
nécessiteglobstar
.find
plutôt que globstar; deux, au lieu de regarder la tête, utilisez lafile
commande pour voir ce que c'est et branchez-vous à partir de là.find
est moins fiable queglobstar
,globstar
est préférable dans presque tous les cas.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)
éventuellement une meilleure version de ce qui précède (moins de tuyaux)
la source
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'utilisationxargs
échouera avec les noms de fichiers contenant des espaces ou des guillemets; utiliserxargs -d '\n'
(nécessite GNUxargs
).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 certainsgrep
etchmod
combo. 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.la source
#!
.