Na página chown(2) man:
Only a privileged process (Linux: one with the
CAP_CHOWNcapability) 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_CHOWNcomsudo setcap cap_chown+ep <program_name>, o que não fará com que o programa seja executado comorootcom todas as suas conseqüências. -
Escreva uma entrada
/etc/sudoersadequada para permitir que esse comando específico seja executado usandosudosem 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/sudoerstem uma diretiva#includedircorrespondente - a maioria das distribuições Linux faz). Certifique-se de que o comando chamado pelo seu script corresponda exatamente!