我有这个C程序:
#include <sys/stat.h>
#include <stdlib.h>
int main(void) {
if (chmod("/tmp/foo", 0755 | S_ISGID) < 0) {
exit(1);
}
exit(0);
}
当我像这样运行时:
rm -f /tmp/foo &&
touch /tmp/foo &&
./a.out &&
ls -al /tmp/foo &&
a.out
以退出代码0
运行,但输出为:
-rwxr-xr-x 1 philipp wheel 0 Mar 16 06:58 /tmp/foo
为什么未在此处设置groupid标志?权限应为-rwxr-sr-x
。
以下事情可以解决问题(但我仍然想知道为什么会看到这种效果):
S_ISUID
)我尝试了但没有奏效:
chmod g+s /tmp/foo
也不起作用/tmp/
的权限更改为不同的权限,例如0777
或4777
所以问题仍然存在:如果不是权限,那么make /tmp/
与其他目录的区别是什么?我能看到的唯一区别是:
ls -al /
显示tmp:
lrwxr-xr-x@ 1 root wheel 11 Dec 11 19:28 tmp -> private/tmp
最后的@
符号表示目录上设置了一些非unix属性。查询ls -l@ /tmp
的人显示:
lrwxr-xr-x@ 1 root wheel 11 Dec 11 19:28 /tmp -> private/tmp
com.apple.FinderInfo 32
com.apple.rootless 0
更新:根据评论反馈和downvote,我认为问题很混乱,所以我完全修改了问题和标题。在修订期间,我发现我错误地比较了我的计划对chmod u+s
的影响,这是错误的,我需要与chmod g+s
进行比较,我也在我的问题中纠正了这一点。
答案 0 :(得分:0)
chmod()
系统调用将文件的权限设置为仅您提供的值。这意味着设置S_IRUSR | S_ISGID
的权限会清除所有其他权限,包括用户写入和执行。
你可能想要的是:
chmod("/tmp/foo", 0755 | S_ISGID);
(0755
是用户读取+写入+执行和组/其他读取+执行的八进制模式 - 它比等效常量的输入少得多。)