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?

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.


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.


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".


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
    
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.