%20durante%20o%20sudo.png)
Eu preciso de wget
algo (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 ( wget
extrair 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 chmod
e chown
para 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 filename
quando seu script é executado como root
. Geralmente não requer senha, dependendo da sua sudoers
configuração.
Como alternativa, execute su username -c touch filename
. Os argumentos adicionais são fornecidos ao shell do usuário e a -c
opçã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 umask
conjunto do shell. Ele define quais permissões sãonegado. Um umask
de 0022
, por exemplo, faznãodefina permissões de gravação para grupo e outros. Defina como 0077
para evitar que o grupo e outras pessoas obtenham permissões.
Você pode definir os setgid
diretó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_GID
se 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 strace
vigilâ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_PRELOAD
mecanismo.
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