Crie um arquivo como um usuário e grupo diferente

4

Eu tenho um script bash que tem que escrever um monte de arquivos localmente e, em seguida, precisa definir o proprietário para o apache e o grupo para um grupo de usuários específico (que não é um membro do apache).

Existe uma maneira de criar esses arquivos com esses donos enquanto eles estão sendo escritos, sem ter que passar por eles e alterá-los depois do fato usando chmod? Existem tantos arquivos que o tempo é preciso passar por eles mais tarde é proibitivo.

Eu tenho que fazer isso para vários grupos de usuários, então eu não deveria adicionar o apache a esses grupos, e certamente não posso torná-los todos o grupo padrão.

Em outras palavras: existe uma maneira de o root criar um arquivo como usuário X e grupo Y quando X não é membro de Y?

Eu tentei usar o runuser, mas não consigo configurar o grupo (presumivelmente porque o apache não pertence ao grupo).

Eu sei que você pode usar chmod para alterar permissões e adicionar qualquer combinação de usuário / grupo. O que eu estou perguntando é se existe uma maneira de abrir um arquivo para escrever e usar qualquer combinação de usuário / grupo ao criá-lo.

Tentativa de usar o sudo:

[root@centos7 tmp]# groups angelo
angelo : angelo wheel
[root@centos7 tmp]# groups apache
apache : apache
[root@centos7 tmp]# sudo -u angelo -g apache touch angelo-file
Sorry, user root is not allowed to execute '/bin/touch angelo-file' as angelo:apache on centos7
[root@centos7 tmp]# ls -ld angelo-file
ls: cannot access angelo-file: No such file or directory
[root@centos7 tmp]# sudo -u angelo -g angelo touch angelo-file
[root@centos7 tmp]# ls -ld angelo-file
-rw-r--r-- 1 angelo angelo 0 Nov 12 03:13 angelo-file
    
por Angelo 17.09.2013 / 16:42

4 respostas

6

Se você quiser criar um arquivo como usuário e grupo específicos sem usar chown , use sudo e especifique o usuário e o grupo:

sudo -u \#49 -g \#58 touch /tmp/something

Observe que o usuário especificado deve ter permissão para gravar no diretório em que você tentou isso.

Ou, você pode iniciar um shell como o usuário atual, com o grupo configurado para outra coisa:

sudo runuser "$USER" -g somegroup

Eu tentei isso em uma caixa Vagrant com sucesso:

[vagrant@localhost ~]$ sudo runuser "$USER" -g floppy
[vagrant@localhost ~]$ touch testfile
[vagrant@localhost ~]$ ls -l testfile
-rw-r--r--. 1 vagrant floppy 0 Nov  9 15:57 testfile
[vagrant@localhost ~]$ 

Isso ocorre apesar do usuário "vagrant" não fazer parte do grupo "disquete".

    
por 12.11.2016 / 04:08
1

Se você tiver um script bash, execute-o como root e corrija a propriedade dentro do próprio script.

    
por 17.09.2013 / 16:57
1

Contanto que você execute o script com privilégios elevados, não haverá problemas. Por exemplo:

#!/usr/bin/env bash 
touch foobar
chown www-data:sudo foobar

Se você for um usuário normal, ele falhará:

$ ./foo.sh 
chown: changing ownership of 'foobar': Operation not permitted

Mas se você executá-lo como root, funciona bem:

$ sudo foo.sh
$ ls -l foobar
-rw-r--r-- 1 www-data sudo 26M Sep 17 17:34 foobar
    
por 17.09.2013 / 17:34
0

Você pode usar 'setuid' em um wrapper c para chmod, mas isso NÃO é recomendado, pois é um buraco de segurança muito ENORME, a menos que seja extremamente restrito em programação.

    
por 17.09.2013 / 17:56