我有一个定期运行的脚本,它会重新应用我运行的游戏服务器主目录的 FACL 和 chmod 权限。
该脚本首先发出主目录范围的递归 chmod,然后将某些文件 chmod 为特定值(首先将所有文件设置为 770,然后进行其他更改)。
脚本中的相关内容:
for d in */; do
< server verification and type checking >
chmod -R 770 ${d%/}
chmod 771 ${d%/}
chmod 775 ${d%/}/$gamedir
< ... chmodding unrelated game asset directories for webserver access ... >
for k in "${BLOCK_DIRS[@]}"; do
if [ -d "$k" ]; then
echo -e "${CYAN}Checking $(pwd)/$k...${NC}"
echo -e "${RED}Debug: chmod -R 1700 $(pwd)/$k${NC}"
chmod -v 1700 "$(pwd)/$k"
chmod -R 0700 "$(pwd)/$k"
fi
done
done
示例输出:
mode of ‘/home/servers/tf_test/tf/../bin’ changed from 0770 (rwxrwx---) to 1700 (rwx-----T)
但是,目录权限只会在第一个循环中最后一个服务器上发生变化。也就是说,第一个 for 循环中有 9 个服务器,而只有最后一个服务器会受到内部 for 循环的更改。
手动发出的相同命令完全可以正常工作。我做错了什么?
(此外,这是我的第一个问题 - 如果我没有说出一些重要的事情 - 请纠正我,我会相应地编辑问题)
答案1
ls
不显示所有者组的访问标志 - 它显示最高组的访问权限,这欺骗了我。我还重新安排了脚本中的 chmod,以便它们首先 chmod 目录的内容,然后 chmod 目录本身,现在粘性位可以正常工作。
至于ls
组权限问题。
foo@bar:/foo# ls -lha game_server | grep bin
drwxrwx--T+ 2 gameaccount gameaccount 4.0K Dec 21 20:56 bin
foo@bar:/foo#
该目录归 gameaccount 所有,并且看起来拥有该目录的组 gameaccount 具有 7 个权限位,对吗?错误的
foo@bar:/foo# getfacl game_server/bin
# file: game_server/bin
# owner: gameaccount
# group: gameaccount
# flags: --t
user::rwx
group::---
group:root:rwx
mask::rwx
other::---
问题可以关闭 - ls 只是没有显示我期望的权限位。