Altera recursivamente o proprietário de um diretório pelo nome desse diretório

1

No Ubuntu 16.04, tenho alguns diretórios de sites sob /var/www/html/ .

Eu desejo que o proprietário de cada diretório seja idêntico ao nome da pasta.

Como eu poderia alterar recursivamente o proprietário de um diretório pelo nome desse diretório?

Notas:

1) Eu já criei um usuário para cada diretório, como em:

useradd ${domain} --gecos --disabled-password --disabled-login

2) O objetivo desta operação é por motivos de segurança - impedir que todos os dirs tenham o mesmo proprietário.

    
por Arcticooling 17.01.2018 / 20:04

4 respostas

4

Script de trabalho

Supondo que o www-data é o grupo correto para o seu servidor web

Digite o seguinte com seu editor favorito em chown_www.sh

#!/bin/bash

for directory in 'find /var/www/html/ -mindepth 1 -maxdepth 1 -type d'
do

    user=$(basename $directory)
    chown -R $user:www-data $directory
done

torne-o executável

chmod +x /path/to/script/chown_www.sh

e execute como root ou via sudo

sudo /path/to/script/chown_www.sh

Disclaimer: Isto não tem verificação de erros para ver se os nomes dos diretórios são usuários viáveis (e / ou nomes limpos).

Explicação

O find com uma profundidade mínima / máxima de 1 só encontrará diretórios localizados diretamente em /var/www/html - que é o que você deseja.

-type d no caso de haver alguns arquivos em /html .

Em seguida, obtemos o nome do diretório com basename e fazemos o recursivo chown , como você queria.

Disclaimer: Isso é inspirado pelo usuário muclux, mas minha edição foi rejeitada

    
por Robert Riedl 22.01.2018 / 15:50
0

Não sei se o seu plano é bom, mas o script a seguir pode fazer o trabalho (chamado com sudo). Tenha em atenção que só pode utilizar userIDs existentes como proprietários.

#!/bin/bash
cd /var/www

for file in 'find html/*'
do
    d='dirname $file'
    p='basename $d'
    chown $p:www-data $file
done

O script trata arquivos e subdiretórios da mesma forma, portanto, não há necessidade de recursão.

basename (dirname (file)) fornece o nome do diretório "pai" imediato.

    
por muclux 17.01.2018 / 20:33
0

Suponho que você tenha N diretórios abaixo de /var/www/html e deseje alterar apenas o proprietário desses diretórios de nível superior (recursivamente), ou seja,

/var/www/html/domain1   # -> change owner to "domain1" for this dir and below
/var/www/html/domain2   # -> change owner to "domain2" for this dir and below
/var/www/html/domain3   # -> change owner to "domain3" for this dir and below

Se, e. /var/www/html/domain1 tem subdiretórios (como public , css , data ), então eles devem não pertencer a um usuário public etc., mas também ao usuário domain1 .

Dada esta condição prévia, o seguinte scriptlet funcionará (como usuário root ):

#!/usr/bin/env bash
cd /var/www/html
GLOBIGNORE=.    # to catch hidden directories
for dir in *; do
    test -d $dir && chown -R $dir $dir;
done
    
por PerlDuck 21.01.2018 / 14:08
0

Que tal find ?

find /var/www/html -mindepth 1 -maxdepth 1 -type d -exec bash -c 'echo chown -R "${0##*/}" "$0"' {} \;

Isso simplesmente encontrará todos os d irectories em /var/www/html/ e não mais abaixo e exec ute chown -R em cada um deles. Dentro do shell bash $0 é o caminho do diretório atualmente processado e ${0##*/} é o nome do diretório recortado. Eu adicionei um echo acima para que ele imprima cada comando chown que será executado primeiro, se você estiver satisfeito com os resultados, execute-o sem o echo .

Se por algum motivo você quiser ou precisar de uma abordagem diferente para a tarefa, aqui estão algumas alternativas (todas com echo para teste!), sendo o parallel o mais eficiente no caso de um enorme número de diretórios:

for i in /var/www/html/*/; do a=${i%/}; echo chown -R "${a##*/}" "$i"; done
for i in /var/www/html/*/; do echo chown -R "$(dirname $i)" "$i"; done
parallel echo chown -R '{=s/\/$//;s/.*\///=}' {} ::: /var/www/html/*/
    
por dessert 24.01.2018 / 00:11