我有一个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为什么这里没有设置标志?权限应该是-rwxr-sr-x。
下面的事情可以解决这个问题(但我仍然不知道为什么我会看到这样的效果):
S_ISUID)我试过但没有成功的事情:
chmod g+s /tmp/foo也不起作用/tmp/上的权限更改为不同的东西,例如0777或4777因此,问题仍然存在:如果不是权限,/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 0Update:根据评论反馈和否决投票,我认为这个问题令人困惑,所以我完全修改了问题和标题。在修订过程中,我发现我错误地将我的程序与chmod u+s的效果进行了比较,这是错误的,我需要与chmod g+s进行比较,我在我的问题中也纠正了这一点。
发布于 2017-03-15 16:08:45
chmod()系统调用只将文件的权限设置为所提供的值。这意味着设置S_IRUSR | S_ISGID权限将清除所有其他权限,包括用户写入和执行权限。
你可能想要的是:
chmod("/tmp/foo", 0755 | S_ISGID);(0755是用户read+write+execute和组/其他read+execute的八进制模式-它比等效常量少得多。)
https://stackoverflow.com/questions/42811165
复制相似问题