工作脚本

工作脚本

在 Ubuntu 16.04 中我有几个网站目录/var/www/html/

我希望每个目录的所有者与目录的名称相同。

我如何通过目录名称递归地更改目录的所有者?

笔记:

1)我已经为每个目录创建了一个用户,如下所示:

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

2)此操作的目的是出于安全原因 - 防止所有目录拥有相同的所有者。

答案1

工作脚本

假设 www-data 是你的 Web 服务器的正确组

使用您喜欢的编辑器输入以下内容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

使其可执行

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

并以 root 身份或通过 sudo 执行

sudo /path/to/script/chown_www.sh

免责声明:这没有错误检查来查看目录名称是否是可行的用户(和/或干净的名称)。


解释

最小find/最大深度为 1 只会找到直接位于其下的目录/var/www/html- 这就是您想要的。

-type d万一有一些文件/html

然后我们得到目录的名称basename并执行递归chown,就像你想要的那样。


免责声明:这是受用户 muclux 启发的,但我的编辑被拒绝了

答案2

我不知道你的计划是否好,但以下脚本可以完成这项工作(使用 sudo 调用)。请注意,你只能使用现有的用户 ID 作为所有者。

#!/bin/bash
cd /var/www

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

该脚本对文件和子目录一视同仁,因此无需递归。

basename (dirname (file)) 为您提供直接“父”目录的名称。

答案3

我假设你下面有 N 个目录/var/www/html,并且只想(递归地)更改这些顶级目录的所有者,即

/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

如果例如/var/www/html/domain1有子目录(如public,,cssdata,那么他们应该不是属于用户public等,也属于用户domain1

在此前提条件下,以下脚本将起作用(作为用户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

答案4

怎么样find

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

这将简单地查找d下面的所有目录/var/www/html/,而不是更下面的目录,并对每个目录执行execute。bash shell 内部是当前处理的目录的路径,是剪切出的目录名称。我添加了上面的命令,以便它会首先打印要执行的每个命令,如果您对结果满意,只需运行它而不使用。chown -R$0${0##*/}echochownecho

如果出于任何原因,你想要或需要采用不同的方法来完成任务,这里有一些替代方案(均经过echo测试!),其中parallel一种是最有效的巨大的目录数量:

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/*/

相关内容