Unix: Existe uma maneira de “copiar” permissões de arquivo ou diretório?

14

Eu tenho dois arquivos em um diretório. Um tem permissões corretas e o outro não. Existe uma maneira que eu possa "copiar" o conjunto de permissões de um arquivo para outro?

    
por Svish 28.02.2010 / 16:09

4 respostas

15

A versão GNU do utilitário chmod pode copiar o modo de um arquivo ( RFile ) para outro ( file ).

chmod --reference=RFile file
GNU coreutils é encontrado na maioria das distribuições Linux e no Cygwin, entre outros lugares. Nem todas as implementações chmod fornecem esta opção.

    
por 28.02.2010 / 16:16
1

Eu inventei isso:

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

Não é totalmente à prova de bala, mas faz o que eu preciso.

    
por 24.07.2014 / 01:45
0

tente isto:

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

isso subiria de forma recursiva e chmod a cada arquivo, se dois diretórios não corresponderem em arquivos, você verá um monte de erro "Nenhum arquivo ou diretório".

    
por 08.01.2018 / 14:07
0

Você pode usar getfacl para recuperar a lista completa de permissões de arquivos, proprietário, grupo e ACLs adicionais (listas de controle de acesso).

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

Se você salvar essa saída em um arquivo (por exemplo, acl.txt ), poderá restaurar a partir desse formato com setfacl --restore acl.txt . Se você quiser restaurar apenas um único arquivo, e esse arquivo tiver um nome de arquivo diferente do original, você deverá usar setfacl --set-file acl.txt filename.txt (onde filename.txt é o novo nome do arquivo).

Etapas

  1. Salvar as permissões originais em acl.txt :

    $ getfacl filename.txt > acl.txt
    
  2. Substituir permissões (para demonstração; isso é apenas para você ver que a restauração na próxima etapa 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 setfacl para restaurar as permissões corretas de acl.txt :

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

O nome do arquivo é retirado do comentário # file: gerado por getfacl , portanto, não há necessidade de especificá-lo na linha de comando.

Se você quiser restaurar essas permissões para um arquivo diferente, use --set-file em vez de --restore da seguinte forma:

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

Exemplo

Se você acabar substituindo as permissões em alguns arquivos em /usr , mas não souber quais arquivos foram sobrescritos, normalmente poderá corrigi-los restaurando de outro sistema configurado de forma semelhante.

  1. Permissões de backup do sistema em funcionamento (nota: getfacl gera caminhos relativos, portanto, assegure-se de que cd seja um local consistente em ambas as máquinas)

    # cd /
    # getfacl -R usr > /root/acls.txt
    
  2. Copie o dump da ACL para o sistema com permissões quebradas

    $ scp root@working-system:/root/acls.txt .
    $ scp acls.txt root@broken-system:/root/
    
  3. Restaure o dump da ACL para sobrescrever as permissões quebradas com aquelas da máquina boa conhecida

    # cd /
    # setfacl --restore /root/acls.txt
    
por 08.01.2018 / 15:36