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

17

Eu preciso de wget something (resulta em um arquivo compactado em cwd), então eu tenho que extraí-lo, então faço algumas cópias / mudanças / modificações e talvez finalmente execute 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 é de propriedade do usuário root ou sudo. Quando eu terminar (e às vezes no meio do caminho), eu tenho que emitir uma série de comandos chmod e chown para fazer as coisas direito.

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

    
por اشکان نظری 07.02.2012 / 09:33

3 respostas

20

Você sempre pode sudo -u username touch filename quando seu script é executado como root . Geralmente não requer senha, dependendo da configuração do sudoers .

Como alternativa, execute su username -c touch filename . Os argumentos adicionais são fornecidos para o shell do usuário, e a opção -c 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 umask definido para o shell. Define quais permissões são negadas . Um umask de 0022 , por exemplo, não define permissões de gravação para grupos e outros. Defina como 0077 para evitar que o grupo e outras pessoas recebam permissões.

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

chmod g+s someDir

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

    
por 07.02.2012 / 09:42
5

Existe outro jeito, muito elegante, eu acho. Usando install (1)

Por exemplo, o zabbix-agentd precisa de uma subpasta dentro de / var / run, mas as distribuições recentes estão usando tmpfs para / var / run, portanto, 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
    
por 07.12.2015 / 12:47
3

Em sistemas semelhantes a Unix, os arquivos e diretórios recém-criados são de propriedade do proprietário do processo que os criou. Os utilitários padrão normalmente não têm a 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 para se 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 automaticamente a lista de arquivos e diretórios criados (e possivelmente modificados), poderá executar seus comandos em strace surveillance, que é baseado 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 mecanismo LD_PRELOAD .

Idéias para trabalhos futuros

Com base nos métodos mencionados acima, é possível criar uma ferramenta que altere 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
    
por 06.08.2015 / 15:26