用于修复目录和文件所有权的 Bash 脚本

用于修复目录和文件所有权的 Bash 脚本

我的客户让我将一些文件夹部署到他客户网站的多个主目录中。我使用 Bash 脚本执行了此操作,但最终使用了 root 帐户权限。

如何编写一个 Bash 脚本,将 /home/ 下的每个文件夹用户(不是隐藏文件或文件夹),获取该文件夹的用户和组所有权,然后执行 chown -R {user}.{group} /home/用户

服务器运行的是 CentOS Linux。

答案1

我认为你问的方式有点倒退。你不想找到每个文件夹然后找到用户,而是想找到用户并找到他们的主文件夹。

#!/bin/bash
while IFS=':' read -r login pass uid gid uname homedir comment; do 
    echo chown $uid:$gid "$homedir"; 
done < /etc/passwd

当然,您需要删除 echo,并且需要使用 root 权限运行此程序。我ls自己也总是建议使用 while 循环而不是 for 循环。您可以保存此循环以用于执行任何操作/etc/passwd

答案2

我必须完全赞扬 Kyle Brandt。所以,如果您喜欢下面的这个答案,请点击他帖子上的向上三角形来提升他的状态。

然而,我改进了他的做法,并觉得我有责任将其发布在这里并将其标记为最终答案。

我给 Kyle 的例程添加的所有内容是确保我们只接触主目录,因此是带有星号的行。然后,我确保这个主目录实际上仍然存在。之后,我执行 chown 语句。就像 Kyle 所说的那样 - 删除“echo”关键字,它就会真正执行任务。然后,我在 chown 上添加了“-R”,以使其递归工作,以防问题可能深入到某人的主目录中。

#!/bin/bash

while IFS=':' read -r login pass uid gid uname homedir comment; do
    if [[ "$homedir" = **/home/** ]]; then
        if [ -d "$homedir" ]; then
            echo chown -R $uid:$gid "$homedir";
        fi
    fi
done < /etc/passwd

答案3

#!/bin/bash

for f in $( ls /home/ );
  do chown -R $f:yourgroup /home/$f
done

这其中没有健全性检查,而且我在没有进行任何测试的情况下就写了它,所以要小心。

(顺便说一句,“没有隐藏文件或文件夹”的要求将通过以下事实得到满足:Unix 中的隐藏文件只是一个前面带有 . 的常规文件,并且 .username 不是 chown 的有效用户)。

答案4

使用getent获取每个用户 ID 大于或等于 500 的用户的用户名、组名和主目录,并通过 应用它们chown -R。此外,现在是user:group

相关内容