Criando arquivos e diretórios com um determinado proprietário (usuário/grupo) durante o sudo

Criando arquivos e diretórios com um determinado proprietário (usuário/grupo) durante o sudo

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

Agora, todas essas tarefas diretamente ( wgetextrair etc.) ou indiretamente (executando o script) resultam na criação de arquivos e diretórios (todos no diretório de trabalho atual). Eu faço tudo isso como root(não há como fazer isso com o usuário final desejado).

O problema é: qualquer coisa criada no processo pertence ao root ou ao usuário sudo. Quando termino (e às vezes no meio do caminho), tenho que emitir uma série de comandos chmode chownpara consertar as coisas.

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

Responder1

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 do 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 do shell. Ele define quais permissões sãonegado. Um umaskde 0022, por exemplo, faznãodefina permissões de gravação para grupo e outros. Defina como 0077para evitar que o grupo 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 Unixesapoiaro mesmo comportamento para setuid( chmod u+s), mas não para Linux.

Responder2

Existe outra maneira, bastante elegante, eu acho. Usando instalar(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, então o diretório não sobrevive a reinicializações. Eu resolvi isso criando um arquivo /etc/sysconfig/zabbix-agentd contendo:

install -g zabbix -o zabbix -d /var/run/zabbix

Responder3

Em sistemas do tipo Unix, os arquivos e diretórios recém-criados pertencem ao proprietário do processo que os criou. Os utilitários padrão normalmente não possuem opção de 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_UID​​e $SUDO_GIDse referir ao usuário que invocou 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, você pode executar seus comandos sob stracevigilância, que são baseados no ptrace()syscall:

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

ou você pode usar por exemploInstalar relógioque é baseado no LD_PRELOADmecanismo.

Ideias para trabalhos futuros

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

sudo watch-chown do_something

informação relacionada