Na página chown(2)
man:
Only a privileged process (Linux: one with the
CAP_CHOWN
capability) may change the owner of a file. The owner of a file may change the group of the file to any group of which that owner is a member. A privileged process (Linux: withCAP_CHOWN
) may change the group arbitrarily.
Seu processo não é privilegiado nem altera o grupo de um arquivo que pertence a um grupo em que o proprietário esteja.
Portanto, você precisará obter privilégios adequados. As duas maneiras mais fáceis de fazer isso são
-
Escreva um programa binário mínimo (provavelmente em C) para definir a propriedade desse arquivo (suponho que o nome do caminho do arquivo possa ser codificado, para evitar abusos) e torná-lo set-user-id para root, ou melhor ainda, adicione
CAP_CHOWN
comsudo setcap cap_chown+ep <program_name>
, o que não fará com que o programa seja executado comoroot
com todas as suas conseqüências. -
Escreva uma entrada
/etc/sudoers
adequada para permitir que esse comando específico seja executado usandosudo
sem uma senha: escreva uma linha comobar ALL = (root) NOPASSWD: /bin/chown foo:server '/full/path/to/file'
para um arquivo em
/etc/sudoers.d
(e verifique se/etc/sudoers
tem uma diretiva#includedir
correspondente - a maioria das distribuições Linux faz). Certifique-se de que o comando chamado pelo seu script corresponda exatamente!