我的客户让我将一些文件夹部署到他客户网站的多个主目录中。我使用 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
。