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 de "copiar" o conjunto de permissões de um arquivo para outro?

Svish
fonte

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

O coreutils GNU é encontrado na maioria das distribuições Linux e Cygwin, entre outros lugares. Nem todas as implementações de chmod fornecem essa opção.

Jeremy L
fonte
Hum ... parece que isso deveria funcionar, mas não é suportado no Mac OS X? Lá eu só obter opção ilegal ...
Svish
2
chmod não é um comando interno do bash . é um utilitário separado disponível em muitos unixes. a --referenceopção está incluída na versão GNU; O OSX provavelmente usa um chmod que se origina no BSD. OSX man chmod : developer.apple.com/Mac/library/documentation/Darwin/Reference/…
quack quixote
Svish, você pode considerar instalar as versões do GNU através do MacPorts.
L
Só percebi que seria útil mencionar aqui que cp -dpR <source-file> <dest-file>a vontade, ao copiar um arquivo, copiar permissões, bem como a file.r
LawrenceC
1

Eu vim com isso:

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

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

Ikem Krueger
fonte
0

tente isto:

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

isso aumentaria recursivamente e chmod todos os arquivos, se dois diretórios não corresponderem aos arquivos, você verá muitos erros "Não existe esse arquivo ou diretório".

bersam
fonte
find /home/myubuntuuser/Desktop/test1 -exec chmod --reference /home/myubuntuuser/Desktop/test2/{} {} \;
Rick Sanchez
chmod: falha ao obter atributos de '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1': Não existe esse arquivo ou diretório chmod: falha ao obter atributos de '/ home / myubuntuuser / Desktop / test2 // home / myubuntuuser / Desktop / test1 / 111.txt ': Não existe esse arquivo ou diretório chmod: falha ao obter atributos de' /home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/222.txt ': Não esse arquivo ou diretório chmod: falha ao obter atributos de '/home/myubuntuuser/Desktop/test2//home/myubuntuuser/Desktop/test1/333.txt': Não existe esse arquivo ou diretório
Rick Sanchez
testei em 2 pastas: test1 e test2. cada um tem os mesmos arquivos 111/222 / 333.txt com permissões diferentes. test1 tem os padrões. test2 tem 777 permissões. este é o erro que recebo.
Rick Sanchez
0

Você pode usar getfaclpara recuperar a lista completa de permissões de arquivo, 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 deste 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, será recomendável usá-lo setfacl --set-file acl.txt filename.txt(onde filename.txtestá o novo nome do arquivo).

Passos

  1. Salve as permissões originais para acl.txt :

    $ getfacl filename.txt > acl.txt
    
  2. Sobrescrever permissões (para demonstração; isso é apenas para que você possa 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 setfaclpara 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 é obtido no # file: comentário gerado por getfacl, portanto, não há necessidade de especificá-lo na linha de comando.

Se você deseja restaurar essas permissões para um arquivo diferente, use em --set-filevez de--restore :

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

Exemplo

Se você acabar substituindo as permissões em alguns arquivos /usr, mas não souber quais arquivos foram substituídos, geralmente poderá corrigi-lo restaurando a partir de outro sistema configurado da mesma forma.

  1. Permissões de backup do sistema em funcionamento (nota: getfaclgera caminhos relativos, portanto, garanta cdum local consistente nas duas 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 despejo da ACL para substituir as permissões quebradas pelas da máquina válida

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