首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setgid不工作/tmp/

setgid不工作/tmp/
EN

Stack Overflow用户
提问于 2017-03-15 13:26:36
回答 1查看 211关注 0票数 0

我有一个C程序:

代码语言:javascript
复制
#include <sys/stat.h>
#include <stdlib.h>

int main(void) {
    if (chmod("/tmp/foo", 0755 | S_ISGID) < 0) {
            exit(1);
    }
    exit(0);
}

当我像这样运行它时:

代码语言:javascript
复制
rm -f /tmp/foo &&
touch /tmp/foo &&
./a.out &&
ls -al /tmp/foo &&

a.out使用退出代码0运行,但输出如下:

代码语言:javascript
复制
-rwxr-xr-x  1 philipp  wheel  0 Mar 16 06:58 /tmp/foo

为什么这里没有设置标志?权限应该是-rwxr-sr-x

下面的事情可以解决这个问题(但我仍然不知道为什么我会看到这样的效果):

  • 以root用户身份运行程序
  • 在另一个目录中运行它
  • 在Linux上运行它
  • 设置set-user-id (S_ISUID)
  • 我敢说它在OSX的早期版本中起了作用

我试过但没有成功的事情:

  • chmod g+s /tmp/foo也不起作用
  • 禁用csrutil没有改变任何事情。
  • /tmp/上的权限更改为不同的东西,例如07774777

因此,问题仍然存在:如果不是权限,/tmp/与其他目录的区别是什么?我唯一能看到的区别是:

代码语言:javascript
复制
ls -al /

显示tmp如下:

代码语言:javascript
复制
lrwxr-xr-x@   1 root  wheel     11 Dec 11 19:28 tmp -> private/tmp

最后的@符号显示目录上设置了一些非unix属性。使用ls -l@ /tmp查询这些内容显示:

代码语言:javascript
复制
lrwxr-xr-x@ 1 root  wheel  11 Dec 11 19:28 /tmp -> private/tmp
    com.apple.FinderInfo    32
    com.apple.rootless       0

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

EN

回答 1

Stack Overflow用户

发布于 2017-03-15 16:08:45

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

你可能想要的是:

代码语言:javascript
复制
chmod("/tmp/foo", 0755 | S_ISGID);

(0755是用户read+write+execute和组/其他read+execute的八进制模式-它比等效常量少得多。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42811165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档