it-swarm-es.tech

Accidentalmente chmod -R + x en un directorio. ¿Cómo restauro los permisos correctos?

Bueno, para ser específico, fue chmod -R 755. Ahora todos los archivos son ejecutables, lo que no quiero. Estoy pensando que debería mirar los primeros dos bytes de cada archivo para el #!, pero ¿esto cubrirá todo? ¿Debería usar file para ver todo y basar mi decisión en eso? O, lo que es más probable, ¿existe una forma aún mejor de hacer esto?

¿Cuál es la forma preferida de recorrer de forma recursiva un directorio y establecer -x en archivos que no 'se supone que son' ejecutables?

21
Larry Wang

No hay una fórmula mágica aquí. Los permisos contienen información que no siempre es redundante.

Si hubiera hecho esto en un directorio del sistema, su sistema estaría en muy mal estado, porque tendría que preocuparse por los bits setuid y setgid, y por los archivos que se supone que no son legibles por todo el mundo, y por los archivos que se supone que se pueden escribir en grupo o en todo el mundo.

En un directorio por usuario, debe preocuparse por los archivos que no se supone que sean legibles por todo el mundo. Nadie puede ayudarte allí.

En cuanto a la capacidad de ejecución, una buena regla general sería hacer que todo lo que no parezca que se pueda ejecutar, no sea ejecutable. El kernel puede ejecutar scripts cuyos primeros dos bytes son #!, Binarios ELF cuyos primeros cuatro bytes son \x7fELF dónde \x7f es el byte con el valor 12, y algunos tipos de archivos más raros (a.out, cualquier cosa registrada con binfmt_misc). Por lo tanto, el siguiente comando debería restaurar sus permisos a un estado razonable (asume bash 4 o zsh, de lo contrario use find para recorrer el árbol de directorios; advertencia, escrito directamente en el navegador):

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

Tenga en cuenta que hay una forma sencilla de realizar una copia de seguridad y restaurar los permisos de un árbol de directorios, en Linux y posiblemente otros unices con soporte ACL:

getfacl -R >saved-permissions
setfacl --restore=saved-permissions

Creo que querrás algo como

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

Esto busca todos los archivos normales, de forma recursiva en dir, (excluye directorios y dispositivos) y elimina el bit ejecutable.

Comenzaría aquí y luego trabajaría en mi camino hacia la creación de archivos que se supone que son ejecutables, ejecutables.

Lo siguiente debería funcionar exactamente como lo solicitó (encontrará todos los archivos normales, los grep para #! Y luego eliminará los bits x si no los encuentra)

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

posiblemente una mejor versión de lo anterior (menos tuberías)

find . -type f -exec grep -L #! '{}' + | xargs chmod ugo-x 
6
xenoterracide

Bueno, sin una línea Shebang, el archivo se ejecutará como un script de Shell, nominalmente con /bin/sh. Su idea es un buen comienzo y suponiendo que el directorio en cuestión no contiene archivos de misión crítica, probablemente no hay mucho riesgo de ejecutar una combinación de grep y chmod. Puede encontrar falsos positivos, es decir, archivos con una línea Shebang que no están destinados a tener su bit ejecutable configurado, pero sin conocer más información sobre el propósito de lo que hay en el directorio, solo usted puede decidir si eso representa una amenaza existencial significativa para su sistema y/o datos.

0
gvkv