Como manter a propriedade de um arquivo após a edição?

9

A minha pergunta é semelhante a este outro , exceto que se pergunta sobre arquivos recém-criados.

Na minha caixa Unix, os usuários alice , bob e tomcat estão no grupo tomcat .

Os arquivos de configuração do servidor Tomcat são de propriedade do usuário tomcat e do grupo tomcat.

Alterei as permissões deste arquivo para legíveis e graváveis por grupo, para que alice e bob possam editar os arquivos.

No entanto, notei que, após a edição, o arquivo passa a pertencer ao último usuário que o editou.

Q: É possível alterar permissões para que Alice e Bob possam editar os arquivos, sem alterar a propriedade deles?

Como editar um arquivo altera sua propriedade de qualquer maneira?

    
por Leonel 01.06.2017 / 20:42

2 respostas

16

O usuário resultante do arquivo depende do que o editor faz. Alguns editores salvam o arquivo truncando-o e gravando o arquivo (sem alterar o inode). E alguns editores renomeiam o arquivo para outro nome ( file to file~ é usual) e cria um novo arquivo com o nome do original. Modificar o arquivo original mantém o proprietário o mesmo, criando um novo torna o novo arquivo pertencente ao UID do processo de criação.

Dos editores que eu tenho no Debian, nano e joe , bem como nvi e vim (a versão mínima em vim-tiny ) parece sobrescrever no local. Embora eu suponha que vim e Emacs sejam configuráveis no que fazem.

Stephen comenta sobre atualizações atômicas . O problema com a recriação in-loco é que o arquivo é truncado para comprimento zero e, em seguida, gravado. Outro processo poderia abrir e ler antes de todos os dados serem gravados.

Uma atualização atômica seria feita criando a nova versão como file.new e, em seguida, renomeando file.new para file . Deixando um arquivo de backup, é possível criar file.new , vincular file a file~ e renomear file.new a file . A renomeação é atômica em que qualquer processo que acessa o arquivo pelo nome obtém a versão antiga ou nova, e não qualquer coisa entre elas. Quaisquer identificadores de arquivos abertos, obviamente, apontam para o arquivo que foi mantido aberto, dando uma visão consistente sobre o arquivo.

Do ponto de vista de permissões de arquivo , salvar sobre o mesmo arquivo (inode) requer acesso de gravação ao arquivo em si (mas não ao diretório), renomeá-lo e criar um novo requer acesso de gravação para o diretório (mas não para o arquivo original).

(Renomear e recriar também é, aliás, uma maneira de consertar as permissões de arquivos no caso de alguém criar ou modificar um arquivo em um diretório compartilhado, mas esquece de dar acesso de grupo a ele.)

    
por 01.06.2017 / 21:10
13

Como explicado por ilkkachu , se o editor usado cria um novo arquivo ao salvar, então não há como controlar o proprietário do arquivo. O que você provavelmente realmente se importa é garantir que os arquivos permaneçam legíveis pelo Tomcat; você pode fazer isso garantindo que seu grupo seja tomcat (e eles podem ser lidos por seu grupo), e isso pode ser imposto em novos arquivos, definindo o setgid bit no diretório pai :

chmod g+s .

Assim, se bob edita um arquivo usando um editor que recria o arquivo, o arquivo editado será propriedade de bob:tomcat e o Tomcat ainda poderá lê-lo (com uma típica umask finalmente). Contanto que o diretório pai seja gravável pelo grupo tomcat , qualquer usuário desse grupo poderá editar arquivos no diretório (se apenas recriando-os).

No entanto, recomendo investigar a alteração dos seus processos; você provavelmente não deveria estar editando arquivos diretamente no local onde eles foram lidos pelo Tomcat. Idealmente, os arquivos seriam mantidos em um tipo de VCS e implantados por um processo separado (possivelmente automatizado). Dessa forma, você evita todos esses problemas de propriedade ...

    
por 01.06.2017 / 22:49