Maneira padrão de duplicar as permissões de um arquivo

10

Estou tentando encontrar uma maneira POSIX padrão de duplicar as permissões de um arquivo para outro arquivo. Em um sistema GNU, isso é fácil:

[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul  8 20:40 hardcopy.1
---------- 1 alexmchale users 2824 May 14 13:45 hardcopy.4
[alexmchale@bullfrog ~]$ chmod --reference=hardcopy.1 hardcopy.4
[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul  8 20:40 hardcopy.1
-rw-r--r-- 1 alexmchale users 2824 May 14 13:45 hardcopy.4

Infelizmente, o sinalizador --reference para chmod é uma opção não padrão. Então, isso está fora dos meus propósitos. Eu preferiria que fosse uma frase única, mas isso não é necessário. Por fim, ele precisa estar na sintaxe do POSIX sh.

Alex
fonte

Respostas:

7

Uma tentação é analisar ls. Evite essa tentação .

O seguinte parece funcionar, no entanto, está cheio de Kluge. Ele depende de cpmanter as permissões do arquivo de destino. Para esta demonstração, o arquivo "modelo" ainda não deve existir.

  • Copie o arquivo com as permissões que você deseja para um novo arquivo
  • Copie o arquivo que você deseja alterar para o arquivo criado na etapa anterior
  • Remova o arquivo original que você deseja alterar
  • Renomeie o arquivo intermediário para o nome do arquivo a ser alterado

Demo:

$ echo "contents of has">has
$ echo "contents of wants">wants
$ chmod ug+x has     # just so it's different - represents the desired permissions
$ cp has template
$ cat has
contents of has
$ cat wants
contents of wants
$ cat template
contents of has
$ ls -l has wants template
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 16 2010-07-31 09:23 template
-rw-r--r-- 1 user user 18 2010-07-31 09:22 wants
$ cp wants template
$ ls -l has wants template
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 18 2010-07-31 09:24 template
-rw-r--r-- 1 user user 18 2010-07-31 09:22 wants
$ cat template
contents of wants
$ rm wants
$ mv template wants
$ ls -l has wants
-rwxr-xr-- 1 user user 16 2010-07-31 09:22 has
-rwxr-xr-- 1 user user 18 2010-07-31 09:24 wants
$ cat has
contents of has
$ cat wants
contents of wants
Pausado até novo aviso.
fonte
Agora essa é uma abordagem interessante. Vou testar isso e ver como ele funciona em vários servidores. Parece-me que vai dar certo.
Alex
@ Alex: certifique-se de testá-lo com a propriedade do arquivo, também, se isso for uma preocupação.
Pausado até novo aviso.
O primeiro comando cp,, cp has templatedeve ser usado cp -ppara preservar os atributos de modo e propriedade.
mernst
@mernst: Isso é necessário apenas para o primeiro cpcaso o proprietário / grupo do arquivo (por exemplo, "usuário") seja diferente daquele que está fazendo a cópia (por exemplo, raiz).
Pausado até novo aviso.
@Dennis Willamson: OK, mas essa é uma possibilidade e não vejo nenhuma desvantagem em usar cp -plá.
mernst
12

Você pode usar o statcomando para obter a permissão do arquivo:

  • Sintaxe do Mac OS X (BSD):

    chmod `stat -f% A fileWithPerm` fileToSetPerm

  • Sintaxe do Linux (não tenho certeza):

    chmod `stat -c% a fileWithPerm` fileToSetPerm

O símbolo ` é uma citação retroativa.

Studer
fonte
11
Eu não acho que staté exigido pelo POSIX. Geralmente não está disponível.
Pausado até novo aviso.
stat (linha de comando) não é POSIX e não é portátil. Dennis ++
jim mcnamara
1

Os utilitários da ACL getfacl e setfacl podem ser usados ​​para essa finalidade, mas não sei se esse POSIX é compatível o suficiente. Funciona pelo menos no FreeBSD 8.0 e Linux, mas por outro lado pode ser necessário instalar os utilitários da ACL.

Na página de manual:

getfacl file1 | setfacl -b -n -M - file2
Copy ACL entries from file1 to file2.

Eu acho que o getfacl e o setfacl também podem operar permissões de arquivo padrão, além das ACLs.

Janne Pikkarainen
fonte
As ACLs e essas são definidas pelo POSIX são específicas da implementação, portanto, não são necessárias para conformidade.
Pausado até novo aviso.
0

cp -p preservará as permissões de arquivo.

user31894
fonte
11
É por isso que a técnica na minha resposta (de não usar -p) funciona para o que o OP deseja, que é duplicar as permissões para um arquivo diferente , não uma duplicata do arquivo.
Pausado até novo aviso.
0

Uma maneira portátil e direta não é um utilitário padrão - você precisaria chamar stat () no arquivo de modelo e depois chmod () no (s) arquivo (s) de destino. Isso significa usar uma linguagem como C ou outra linguagem amplamente usada como perl.

As permissões de acesso ao arquivo são especificadas no membro struct stat st_mode pelos 0007777 bits. A solução de Dennis está correta, se for um pouco pesada em E / S, portanto, para arquivos realmente grandes, pode falhar:

cp has template

Considere este exemplo não pronto para produção:

#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>

mode_t 
getperm(const char *template_file)
{
    struct stat st;
    if(stat(template_file, &st)==-1)
    {
       perror("Cannot stat file");
       exit(1);
    }
    return st.st_mode;
}

int main(int argc, char **argv)
{    
    mode_t mode=getperm(argv[1]);
    int i=0;
    for(i=2; argv[i]!=NULL; i++)    
    {
       if(chmod(argv[i], mode)==-1)
          fprintf(stderr, "Permissions failed on %s:\n\t%s\n",
              argv[i], strerror(errno));
    }       
    return 0;
}
jim mcnamara
fonte