Unix: ¿Hay alguna forma de "copiar" permisos de archivos o directorios?

14

Tengo dos archivos en un directorio. Uno tiene los permisos correctos y el otro no. ¿Hay alguna manera de "copiar" el conjunto de permisos de un archivo a otro?

Svish
fuente

Respuestas:

15

La versión GNU de la utilidad chmod puede copiar el modo de un archivo ( RFile) a otro ( file).

chmod --reference=RFile file

GNU coreutils se encuentra en la mayoría de las distribuciones de Linux y Cygwin, entre otros lugares. No todas las implementaciones de chmod proporcionan esta opción.

Jeremy L
fuente
Hm ... parece que se supone que esto funciona, ¿pero no es compatible con Mac OS X? Allí solo tengo una opción ilegal ...
Svish
2
chmod no es un comando bash incorporado. Es una utilidad separada disponible en muchos Unixes. la --referenceopción está incluida en la versión GNU; OSX probablemente usa un chmod que se origina con BSD en su lugar. OSX man chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
quack quixote
Svish, podrías considerar instalar las versiones de GNU a través de MacPorts.
Jeremy L
Solo pensé que sería útil mencionar aquí que cp -dpR <source-file> <dest-file>, al copiar un archivo, se copiarán los permisos y el archivo
LawrenceC
1

Se me ocurrió esto:

find $SOURCE -mindepth 1 -printf 'chmod --reference=%p\t%p\n'|sed "s/\t$SOURCE/ $DEST/g"|sh

No es totalmente a prueba de balas, pero hace lo que necesito.

Ikem Krueger
fuente
0

prueba esto:

find /PATH/TO/TARGET -exec chmod --reference /PATH/TO/SOURCE/{} {} \;

esto subiría recursivamente y modificaría cada archivo, si dos directorios no coinciden en los archivos, verá muchos errores de "No existe tal archivo o directorio".

bersam
fuente
find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
Rick Sanchez
chmod: no se pudieron obtener los atributos de '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1': No existe tal archivo o directorio chmod: no se pudieron obtener los atributos de '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1 / 111.txt ': No existe tal archivo o directorio chmod: no se pudieron obtener los atributos de' /home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/222.txt ': No tal archivo o directorio chmod: no se pudieron obtener los atributos de '/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt': No existe tal archivo o directorio
Rick Sanchez
Lo probé en 2 carpetas: test1 y test2. cada uno tiene los mismos archivos 111/222 / 333.txt con diferentes permisos. test1 tiene los predeterminados. test2 tiene 777 permisos. Este es el error que recibo.
Rick Sanchez
0

Puede usar getfaclpara recuperar la lista completa de permisos de archivos, propietario, grupo y ACL adicionales (listas de control de acceso).

$ getfacl filename.txt
# file: filename.txt
# owner: score
# group: score
user::rw-
group::---
other::---

Si guarda esa salida en un archivo (por ejemplo acl.txt), puede restaurar desde este formato con setfacl --restore acl.txt. Si solo desea restaurar un solo archivo, y ese archivo tiene un nombre de archivo diferente al original, tendrá que usarlo setfacl --set-file acl.txt filename.txt(donde filename.txtestá el nuevo nombre de archivo).

Pasos

  1. Guardar permisos originales para acl.txt:

    $ getfacl filename.txt > acl.txt
    
  2. Sobrescribir permisos (para demostración; esto es solo para que pueda ver que restaurarlo en el siguiente paso funciona)

    $ chmod 777 filename.txt
    $ sudo chown nobody:root filename.txt
    $ ls -l filename.txt
    -rwxrwxrwx 1 nobody root 0 Jan  8 14:24 filename.txt
    
  3. Use setfaclpara restaurar los permisos correctos de acl.txt:

    $ sudo setfacl --restore acl.txt
    $ ls -l filename.txt
    -rw------- 1 score score 0 Jan  8 14:24 filename.txt
    

El nombre de archivo se toma del # file:comentario generado por getfacl, por lo que no es necesario especificarlo en la línea de comando.

Si desea restaurar esos permisos en un archivo diferente, puede usarlo en --set-filelugar de hacerlo --restoreasí:

$ setfacl --set-file acl.txt second_filename.txt

Ejemplo

Si termina sobrescribiendo los permisos en algunos archivos /usr, pero no sabe qué archivos ha sobrescrito, generalmente puede solucionarlo restaurando desde otro sistema configurado de manera similar.

  1. Permisos de respaldo del sistema de trabajo (nota: getfaclgenera rutas relativas, así que asegúrese de tener cduna ubicación consistente en ambas máquinas)

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. Copie el volcado de ACL en el sistema con permisos rotos

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. Restaure el volcado de ACL para sobrescribir los permisos rotos con los de la máquina buena conocida

    # cd /
    # setfacl --restore /root/acls.txt
    
Score_Under
fuente