gpt4 book ai didi

c - setgid 不适用于/tmp/

转载 作者:行者123 更新时间:2023-11-30 16:48:55 26 4
gpt4 key购买 nike

我有这个 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

以下操作可以解决该问题(但我仍然想知道为什么会看到这种效果):

  • 以 root 身份运行程序
  • 在不同的目录中运行它
  • 在 Linux 上运行
  • 设置 set-user-id (S_ISUID)
  • 我可以发誓它可以在早期版本的 OSX 中运行

我尝试过但没有成功:

  • chmod g+s/tmp/foo 也不起作用
  • 禁用 csrutil 不会改变任何内容
  • /tmp/ 上的权限更改为不同的内容,例如07774777

所以问题仍然是:如果不是权限,那么 /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

更新:根据评论反馈和否决票,我认为这个问题很困惑,所以我完全修改了问题和标题。在修改过程中我发现我错误地将我的程序的效果与chmod u+s进行了比较,这是错误的,我需要与chmod g+s进行比较,我也纠正了这是我的问题。

最佳答案

chmod() 系统调用将文件的权限设置为您提供的值。这意味着将权限设置为 S_IRUSR | S_ISGID 清除所有其他权限,包括用户写入和执行。

您可能想要的是:

chmod("/tmp/foo", 0755 | S_ISGID);

(0755 是用户读+写+执行和组/其他读+执行的八进制模式 - 它比等效常量少得多的输入。)

关于c - setgid 不适用于/tmp/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42811165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com