Criando arquivos e diretórios com um determinado proprietário (usuário / grupo) enquanto processa

22

Eu preciso de wgetalgo (resulta em um arquivo compactado no cwd), então eu tenho que extraí-lo, fazer algumas coisas de copiar / mover / modificar e talvez finalmente executar um script (do arquivo baixado).

Agora, todas essas tarefas, direta ( wgetextrair etc.) ou indiretamente (executar o script), resultam na criação de arquivos e diretórios (todos no diretório de trabalho atual). Eu faço todas essas coisas como root(não há como fazê-lo com o usuário final desejado).

O problema é: tudo o que é criado no processo pertence à raiz ou ao usuário sudo. Quando termino (e às vezes no meio do caminho), tenho que emitir uma série de comandos chmode chownpara corrigir as coisas.

Agora seria bom se, de alguma forma, pudesse dizer ao sistema que "A partir de agora, todos os arquivos ou diretórios que você criar quando eu emitir comandos como root, você criará com tal e qual propriedade e permissões".

Ashkan Kh. Nazário
fonte

Respostas:

26

Você sempre pode sudo -u username touch filenamequando seu script é executado como root. Geralmente, não requer senha, dependendo da sua sudoersconfiguração.

Como alternativa, execute su username -c touch filename. Os argumentos adicionais são fornecidos ao shell do usuário e a -copção para o shell executa os comandos especificados por convenção.


Alguns comandos (como mkdir) suportam argumentos para especificar as permissões:

mkdir -m 0700 foo

Por padrão, as operações de arquivo respeitam o umaskconjunto para o shell. Ele define quais permissões são negadas . A umaskde, 0022por exemplo, não define permissões de gravação para o grupo e outros. Defina para 0077impedir que grupos e outras pessoas obtenham permissões.


Você pode definir os setgiddiretórios on para que todos os arquivos criados herdem sua associação ao grupo:

chmod g+s someDir

Alguns Unixes suportam o mesmo comportamento para setuid( chmod u+s), mas não para Linux.

Daniel Beck
fonte
11
Eu acho que é seguro supor que não há suporte dedicado para o que você está pedindo. Somente o superusuário pode chownarquivar para um usuário diferente, e definir um padrão como esse tem o potencial de erros do usuário, dando a outros usuários permissões sem que o rootusuário perceba.
Daniel Beck
10

Existe outra maneira, bastante elegante, eu acho. Usando a instalação (1)

Por exemplo, o zabbix-agentd precisa de uma subpasta dentro de / var / run, mas distribuições recentes estão usando tmpfs para / var / run, para que o diretório não sobreviva à reinicialização. Eu o resolvi criando um arquivo / etc / sysconfig / zabbix-agentd contendo:

install -g zabbix -o zabbix -d /var/run/zabbix
Angelo Turetta
fonte
11
Adicione também, -m 0700por exemplo. A resposta
Anel Ø
3
Observe que installcria o diretório e altera o proprietário / grupo. Portanto, há pouco tempo em que o diretório não possui o proprietário / grupo especificado. Em alguns contextos, isso pode importar.
user368507
Isso funciona no Alpine Linux
Mauricio Sánchez
3

Em sistemas tipo Unix, os arquivos e diretórios criados recentemente são de propriedade do proprietário do processo que os criou. Normalmente, os utilitários padrão não têm opção para alterar o proprietário dos arquivos criados.

Variáveis ​​com UID e GID do usuário original

Se você executar alguns comandos repetidamente, poderá usar as variáveis $SUDO_UIDe $SUDO_GIDse referir ao usuário que chamou sudo:

sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"

Obtendo a lista de arquivos e diretórios criados automaticamente

Se você deseja obter a lista de arquivos e diretórios criados (e possivelmente modificados) automaticamente, é possível executar seus comandos sob stracevigilância, com base no ptrace()syscall:

strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something

ou você pode usar, por exemplo, o Installwatch, que é baseado no LD_PRELOADmecanismo.

Ideias para trabalhos futuros

Com base nos métodos mencionados acima, é possível criar uma ferramenta que altere automaticamente o proprietário e possivelmente acesse os direitos dos arquivos criados / modificados. O uso pode ser tão simples quanto:

sudo watch-chown do_something
pabouk
fonte