Executar o chown no script bash produz erros

1

Estou trabalhando em um script que baixa um arquivo com bar:bar ownership e, em seguida, altera a propriedade para foo:server . Então eu escrevi um script paralelo ( chown_test.sh ) para implementar a mudança de propriedade via chown . Uma vez trabalhando, vou injetar no script principal, mas me deparei com um problema (mostrado abaixo), provavelmente devido à minha falta de experiência usando chown .

Observação: tentei incluir todas as informações necessárias abaixo, mas se precisar de mais informações, basta me informar por meio de um comentário.

Estrutura de diretórios, propriedades e permissões:

+ drwxrwxr-x 2 foo:server chown_test  # test directory
├─  -rwxrwxr-- 1 foo:server chown_test.sh  # side script
├─  -rwxrwxr-- 1 bar:bar    file           # empty file

Entradas relevantes de /etc/group :

sudo:x:27:foo
bar:x:33:foo
foo:x:1000:
server:x:1003:bar,foo

O código chown_test.sh :

#!/bin/bash

echo "User: $USER"
chown foo:server ./file

Eu também tentei sudo chown foo:server ./file , mas isso me pede para digitar uma senha sudo para bar , que não tem uma senha sudo.

Saída da execução de chown_test.sh como bar :

[16:13 foo@Opus]:~/chown_test$ sudo -H -u bar bash -c ./chown_test.sh
User: bar
chown: changing ownership of ‘./file’: Operation not permitted

Saída da execução de chown_test.sh como foo :

[16:14 foo@Opus]:~/chown_test$ ./chown_test.sh 
User: foo
chown: changing ownership of ‘./file’: Operation not permitted


Alguém poderia por favor lançar alguma luz sobre o meu dilema?
Obrigado por ler minha pergunta.

Atualização:

Com a ajuda da resposta e comentários do Toby Speight , cheguei em um meio feliz.

Desde, "Somente um processo privilegiado (Linux: um com o recurso CAP_CHOWN ) pode alterar o proprietário de um arquivo. O proprietário de um arquivo pode alterar o grupo do arquivo para qualquer grupo do qual proprietário é um membro. ", então eu decidi apenas mudar o grupo, não o proprietário.

Eu fiz isso alterando o comando chown em chown_test.sh para:

chown :server ./file

e o resultado:

├─  -rwxrwxr-- 1 bar:server file

O que é adequado para mim, mas se não for adequado para você, dê uma olhada em a resposta de Toby Speight abaixo para mais informações.

    
por Jonny Henly 14.01.2016 / 22:55

1 resposta

3

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: with CAP_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

  1. 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 com sudo setcap cap_chown+ep <program_name> , o que não fará com que o programa seja executado como root com todas as suas conseqüências.

  2. Escreva uma entrada /etc/sudoers adequada para permitir que esse comando específico seja executado usando sudo sem uma senha: escreva uma linha como

    bar 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!

por 14.01.2016 / 23:12