Eu tenho um ambiente de servidor Ubuntu 16.04 Nginx com vários sites CMS (WordPress) na raiz do documento.
Todos os diretórios do site têm www-data
como dono e grupo, recursivamente.
De acordo com algumas consultas de segurança que recebi, 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).
Presumo que a solução seria alterar este comando que sempre executo após adicionar um novo site (e também no cron após atualizações que alteram proprietário e grupo):
chown -R www-data:www-data /var/www/html/*
Para algum comando condicional que altera 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
(eu sempre nomeio os diretórios do site de acordo com o domínio.tld do site).
O que poderia ser tal comando condicional?
Observação: tanto o usuário do Nginx quanto o diretório /var/www/html/
permanecerão com www-data:www-data
.
Atualização para o G-Man:
Ainda não testei mas acho que fica bom se você passar ${domain}
como primeiro argumento para uma variável ( $1
):
chown -R ${domain}:${domain} ${domain}/*
Embora eu o mantivesse:
chown -R ${domain}:www-data ${domain}/*
Claro, adduser ${domain} --disabled-password --disabled-login
é necessário antes, se não foi feito.
Posso estar perdendo alguma coisa, mas isso parece simples:
Se estiver preocupado com a exatidão desses comandos, você pode inserir a palavra
echo
anteschown
de , por exemplo,para que ele diga quais
chown
comandos ele fará, sem realmente executá-los. Esse truque se aplica a toda esta resposta e, de fato, à maioria das soluções de shell script (ou seja, a outras perguntas).Se você quiser fazer isso em uma linha,
Fiz isso
cd
para evitar a complexidade que a outra resposta abrangia. Se você fizerentã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 parachown
. A outra resposta usa umawk
procedimento bastante complicado (e não totalmente confiável) para separar o último nível do caminho do diretório (ou seja, o nome do diretório, que também é o nome do usuário; por exemplo,domain1
) do restante do caminho. Felizmente, podemos fazer algo equivalente (mas um pouco melhor) inteiramente no shell, assim:O
${dir##*/}
é uma forma especial de expansão de parâmetro que pega o valor$dir
e remove tudo até (e incluindo) o último/
caractere (barra). Isso, é claro, deixa apenas o nome base do diretório , ou seja, o nome do usuário, então nós o atribuímosowner
e usamos nochown
comando. Observe que esse 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,
Claro, se sua preocupação é apenas que você não deseja que o diretório de trabalho do shell principal seja alterado, basta executar o primeiro comando em um subshell:
Nem é preciso dizer (mas direi mesmo assim) que isso requer que você tenha usuários (e grupos) chamados
domain1
,domain2
,domain3
, etc., definidos antes de executar qualquer um desses comandos. Se você tiver um script para adicionar um novo site, basta adicionar um comando para criar um novo usuário sempre que criar um novo diretório, antes de executarchown
. Se você executarchown
com um nome que não seja um nome de usuário definido, receberá umainvalid user
mensagem de erro.