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

Ser*_*ker 6 linux permissions bash directory

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

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

服务器正在运行 CentOS Linux。

Kyl*_*ndt 8

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

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

当然,您需要删除回声,并且需要使用 root 权限运行它。我也总是推荐使用 while 循环而不是 for 循环ls。您可以保存此循环以使用/etc/passwd.


Ser*_*ker 8

我必须在上面给凯尔布兰特完全信任。所以,如果你喜欢下面的这个答案,请点击他帖子上的向上三角形来提升他的状态。

但是,我改进了他的例行程序,并觉得我有责任将其发布在这里并将其标记为最终答案。

我在 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
Run Code Online (Sandbox Code Playgroud)


Sve*_*ven 5

#!/bin/bash

for f in $( ls /home/ );
  do chown -R $f:yourgroup /home/$f
done
Run Code Online (Sandbox Code Playgroud)

这里没有健全性检查,我在没有任何测试的情况下编写了它,所以要小心。

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