Como alterar o proprietário e o grupo de um diretório pelo nome desse diretório?

0

Eu tenho um ambiente de servidor Ubuntu 16.04 Nginx com vários sites CMS (WordPress) sob a raiz do documento.

Todos os diretórios do site têm www-data como proprietário e grupo, de forma recursiva.

De acordo com algumas consultas de segurança, isso é problemático porque os dados de um site podem alterar qualquer outro site adjacente (por exemplo, um módulo malicioso instalado em um dos CMSs de um dos sites).

Eu suponho que a solução seria alterar este comando, o qual eu sempre executo depois de adicionar um novo site (e também no cron após as atualizações que alteram o proprietário e o grupo):

chown -R www-data:www-data /var/www/html/*

Para algum comando condicional que altere essas características não apenas para www-data , mas para o nome real do diretório do site.

Para esclarecer, o proprietário de cada diretório do site deve ser domain.tld e o grupo também deve ser domain.tld (sempre nomeio dirs do site conforme o domínio.tld do site).

O que poderia ser um comando tão condicional?

Nota: O usuário do Nginx, assim como o diretório /var/www/html/ , permanecerão com www-data:www-data .

Atualização para o G-Man:

Ainda estou para testar, mas acho que isso é bom se você passar ${domain} como o primeiro argumento para uma variável ( $1 ):

chown -R ${domain}:${domain} ${domain}/*

Embora eu continuasse:

chown -R ${domain}:www-data ${domain}/*

É claro que adduser ${domain} --disabled-password --disabled-login é necessário antes, se não foi feito.

    
por Arcticooling 15.01.2018 / 18:08

1 resposta

3

Eu posso estar faltando alguma coisa, mas isso parece simples:

$ cd /var/www/html
$ for dir in *
do
    chown -R "$dir:$dir" "$dir"
done

Se você estiver preocupado com a exatidão desses comandos, você pode inserir a palavra echo antes de chown , por exemplo,

$ cd /var/www/html
$ for dir in *
do
    echo chown -R "$dir:$dir" "$dir"
done

para que ele diga quais comandos chown ele fará, sem realmente fazê-las. Este truque se aplica ao longo desta resposta, e, de fato, para a maioria das soluções de script de shell (ou seja, para outras questões).

Se você quiser fazer isso em uma linha,

$ cd /var/www/html  &&  for d in *; do chown -R "$d:$d" "$d"; done

Eu fiz o cd para evitar a complexidade que a outra resposta abraçado. Se você fizer

$ for dir in /var/www/html/*

então dir será definido como /var/www/html/domain1 , /var/www/html/domain2 , /var/www/html/domain3 , etc. o que é bom para manipular os diretórios, mas não fornece os nomes de usuário e grupo necessários para chown . A outra resposta usa um pouco complicado (e não totalmente confiável) procedimento awk para separar o último nível do caminho do diretório (ou seja, o nome do diretório, que também é o nome de usuário; por exemplo, domain1 ) do resto do caminho. Felizmente, podemos fazer o equivalente (mas um pouco melhor) inteiramente no shell, assim:

$ for dir in /var/www/html/*
do
    owner="${dir##*/}"
    chown -R "$owner:$owner" "$dir"
done

O ${dir##*/} é uma forma especial de expansão de parâmetros que leva o valor de $dir e remove tudo por meio (e incluindo) o último caractere / (barra). Isso, é claro, deixa apenas o diretório base nome , ou seja, o nome do usuário, então, atribuímos isso a owner e o usamos no comando chown . Tenha em atenção que este código é compatível com POSIX e deve funcionar em qualquer shell compatível com POSIX; ao contrário de algumas das respostas neste site, não depende do bash.

Se você quiser fazer isso em uma linha,

$ for d in /var/www/html/*; do o="${d##*/}"; chown -R "$o:$o" "$d"; done

Claro, se sua preocupação é apenas isso você não quer que o diretório de trabalho do seu shell principal seja alterado, então você pode apenas fazer o primeiro comando em um subshell:

$ (cd /var/www/html  &&  for d in *; do chown -R "$d:$d" "$d"; done)

Não é preciso dizer (mas vou dizer mesmo assim) que isso requer que você tenha usuários (e grupos) chamado domain1 , domain2 , domain3 , etc., definido antes de executar qualquer um desses comandos. Se você tiver um script para adicionar um novo site, é simples adicionar um comando para criar um novo usuário sempre que você criar um novo diretório, antes de executar chown . Se você executar chown com um nome que não seja um nome de usuário definido, você receberá uma mensagem de erro invalid user .

    
por 16.01.2018 / 03:35