修复Linux /home目录下用户主目录文件所有权(含外部认证用户)
修复/home目录下用户主目录的文件所有权(不依赖/etc/passwd)
需求说明
需要编程修复Linux系统中/home目录下所有用户主目录内文件的所有权。由于存在外部认证用户(不在/etc/passwd中),且id命令返回的UID/GID与目录实际的UID/GID不匹配,因此不能依赖用户数据库,必须从主目录本身提取UID和GID,再递归将该权限应用到目录内所有对象。
原脚本的局限
原脚本依赖/etc/passwd获取用户信息,无法处理外部认证用户:
#!/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
场景示例
外部认证用户主目录
目录列表(名称格式):
drwx------+ 3 DOMAIN\user DOMAIN\DOMAIN USERS 4096 Jan 1 1969 user
目录列表(UID/GID格式):
drwx------+ 3 12345 01234 4096 Jan 1 1969 user
id命令输出(与目录UID/GID不匹配):
$ id DOMAIN\\user uid=2000234(DOMAIN) gid=2000349(DOMAIN\domain users) groups=2056789(DOMAIN\domain users) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
stat命令输出(正确获取目录的UID/GID):
$ stat -c "%n %u:%g" /home/user/ /home/user/ 12345:01234
本地用户主目录
目录列表:
drwx------. 4 1000 1000 4096 Jul 21 02:04 user2 drwx------. 4 user2 user2 4096 Jul 21 02:04 user2
id命令输出:
$ id user2 uid=1000(user2) gid=1000(user2) groups=1000(user2),4(adm),190(systemd-journal)
失败的尝试思路
以下脚本未成功实现需求:
find . -exec sh -c ' for f do GID=$(stat -c %g) chown :$GID $f ' find-sh {} \;
可行解决方案
直接遍历/home下的所有子目录(即用户主目录),对每个目录提取其UID和GID,再递归修改目录内所有对象的所有权:
#!/bin/bash # 遍历/home下的所有子目录 for homedir in /home/*/; do # 跳过非目录项 [ -d "$homedir" ] || continue # 从目录本身获取UID和GID owner=$(stat -c "%u:%g" "$homedir") if [ -n "$owner" ]; then echo "修复目录 $homedir 的所有权为 $owner" # 递归修改所有权,加上-v可以查看详细操作(可选) chown -R "$owner" "$homedir" fi done
脚本说明
- 遍历
/home/*/确保只处理主目录(末尾的/过滤掉非目录文件) - 使用
stat -c "%u:%g"直接从目录提取正确的UID:GID,不受外部认证影响 chown -R "$owner" "$homedir"递归将所有权应用到目录内所有文件和子目录- 若需要测试脚本(不实际执行修改),可以将
chown命令前加上echo,先确认操作内容
内容的提问来源于stack exchange,提问作者Astron
相关产品推荐
相关产品推荐

