我有一个 Ubuntu 16.04 Nginx 服务器环境,在文档根目录下有几个 CMS (WordPress) 网站。
所有站点目录都www-data
以递归方式作为所有者和组。
根据我得到的一些安全咨询,这是有问题的,因为来自一个站点的数据可能会改变任何其他相邻站点(例如,安装在其中一个站点的 CMS 中的恶意模块)。
我假设解决方案是更改此命令,该命令在添加新站点后始终运行(并且在更改所有者和组的更新后也在 cron 中):
chown -R www-data:www-data /var/www/html/*
对于一些条件命令,这些命令不仅将这些特征更改www-data
为站点目录的实际名称,而且还更改为站点目录的实际名称。
为了澄清,每个站点目录的所有者应该是domain.tld
,组也应该是domain.tld
(我总是根据站点的 domain.tld 命名站点目录)。
什么可能是这样的条件命令?
注意:Nginx 用户和目录/var/www/html/
都将保留在www-data:www-data
.
G-Man更新:
我还没有测试,但我认为如果你${domain}
作为变量 ( $1
) 的第一个参数传递,这很好:
chown -R ${domain}:${domain} ${domain}/*
虽然我会保留它:
chown -R ${domain}:www-data ${domain}/*
当然,adduser ${domain} --disabled-password --disabled-login
之前是需要的,如果没有做过。
我可能遗漏了一些东西,但这看起来很简单:
如果您担心这些命令的正确性,可以在
echo
之前插入单词chown
,例如,让它告诉您它将执行哪些
chown
命令,而无需实际执行它们。这个技巧适用于整个答案,事实上,适用于大多数 shell 脚本解决方案(即,其他问题)。如果你想在一行中完成,
我这样做是
cd
为了避免其他答案 所包含的复杂性。如果你这样做then
dir
将被设置为/var/www/html/domain1
,/var/www/html/domain2
,/var/www/html/domain3
等,这对于操作目录很好,但不会为您提供所需的用户名和组名chown
。另一个答案使用了一个相当复杂(并且不完全可靠)awk
的过程来将目录路径的最后一级(即目录名称,也是用户名;例如,domain1
)与路径的其余部分分开。幸运的是,我们可以完全在 shell 中做同样的事情(但更好一些),就像这样:${dir##*/}
是一种特殊形式的参数扩展 ,它获取$dir
并删除从最后一个/
(斜杠)字符开始的所有内容。当然,这仅留下目录基本名称,即用户名,因此我们将其分配给owner
并在chown
命令中使用。请注意,此代码是POSIX 兼容的 ,应该可以在任何 POSIX 兼容的 shell 中工作;与本网站上的一些答案不同,它不依赖于 bash。如果您想在一行中执行此操作,
当然,如果您只关心不希望更改主 shell 的工作目录,那么您可以在子 shell 中执行第一个命令:
不言而喻(但我还是会这么说)这要求您在运行任何这些命令之前定义名为
domain1
、domain2
、等的用户(和组)。domain3
如果您有一个添加新站点的脚本,那么在创建新目录之前添加一个命令来创建新用户是一件简单的事情,然后再运行chown
. 如果您chown
使用不是已定义用户名的名称运行,它将给您一条invalid user
错误消息。