Como definir permissões padrão para arquivos movidos ou copiados para um diretório?

8

A minha pergunta é semelhante a Como definir as permissões de arquivo padrão em TODOS os arquivos recém-criados no linux - mas difere de maneiras importantes:

Eu quero que todos os arquivos criados em (ou copiados para ou movidos para) um determinado diretório herdam um conjunto de permissões padrão que seja diferente do padrão do sistema.

Fundamentação: O diretório em questão é o "depósito de entrada" para um aplicativo. Os usuários em um grupo colocam arquivos no diretório e o aplicativo (em outro ID de usuário no mesmo grupo) os pega e os processa. O problema é que o proprietário de cada arquivo colocado no diretório é o usuário que o colocou lá, e as permissões são padronizadas como "rw-r - r--"; Eu quero mudar isso para "rw-rw ----". O aplicativo que faz a entrada não pode fazer isso explicitamente, porque o ID do usuário em que o aplicativo está sendo executado não possui o arquivo em questão, e as permissões padrão não permitem que o aplicativo faça o chmod no arquivo! Obviamente, o usuário poderia fazer um chmod depois de colocar o arquivo lá - mas eu quero manter o "drop" pelo usuário o mais simples possível. (Essas pessoas não são alfabetizadas em linux, elas simplesmente arrastam e soltam os arquivos da área de trabalho do windows para um compartilhamento de rede (Samba) - ou seja, eles nem sabem que estão interagindo com um sistema linux.)

umask parece muito poderosa: eu não quero definir permissões padrão para todos os arquivos criados em qualquer lugar por esses usuários - apenas aqueles criados dentro (ou colocados) neste diretório.

Por favor, avise ... obrigado!

    
por Rob 25.01.2011 / 22:26

3 respostas

5

Você pode usar uma ACL (lista de controle de acesso) para definir as permissões padrão dos arquivos em um diretório.

Em man 5 acl :

If a default ACL is associated with a directory, the mode parameter to the functions creating file objects and the default ACL of the directory are used to determine the ACL of the new object:

  1. The new object inherits the default ACL of the containing directory as its access ACL.

  2. The access ACL entries corresponding to the file permission bits are modified so that they contain no permissions that are not contained in the permissions specified by the mode parameter.

Para configurá-lo (altere o dispositivo, os diretórios, etc., de acordo):

Edite seu arquivo /etc/fstab e adicione a opção acl mount.

/dev/mapper/star-home /home ext3  defaults,acl 0 2

Remontar ( Samba mount.cifs man page ) seu sistema de arquivos reinicializando ou usando:

mount -o remount,acl /home

Verifique se você tem o setfacl e getfacl .

Defina a ACL padrão no diretório (talvez você também precise definir a ACL em arquivos existentes):

$ setfacl -m d:user:george:rwx,d:group:sales-g:rwx,d:group:marketing-g:rwx projections

Veja o tutorial vinculado para mais informações.

Fonte: Tutorial Parte 1 e Parte 2

Referência: Listas de Controle de Acesso POSIX no Linux

    
por 26.01.2011 / 02:27
1

Eu posso oferecer uma solução alternativa: crie um diretório "drop" separado, execute um minijob separado que corrija as permissões e mova os arquivos para o diretório de dados do aplicativo. Você pode usar o incron para que assim não haja virtualmente nenhum atraso de tempo perceptível.

    
por 25.01.2011 / 23:12
1

Posso pensar em quatro métodos possíveis para fazer isso:

  • umask, que você não deseja usar
  • wrapper de programa, que define a umask do aplicativo, não o usuário
  • cron, como descrito por @Peter Eisentraut; find $HOME/intake -type f -exec chmod 660 {} \; , diferentes sistemas têm melhorias de desempenho (como a opção -exec+ )
  • configurações baseadas em diretório, que requerem um pouco de programação de shell para fazer, mas basicamente o shell, ao configurar o prompt ou chamar cd, mudaria o umask se houvesse um arquivo de pontos presente naquele diretório (ou possivelmente um ancestral diretório); para bash, PROMPT_COMMAND='test -s $PWD/.umask && umask $(cat $PWD/.umask)'";$PROMPT_COMMAND" seria o mais simples.
por 25.01.2011 / 23:56