首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >chown不设置SGID。

chown不设置SGID。
EN

Stack Overflow用户
提问于 2016-04-18 17:09:27
回答 1查看 412关注 0票数 1

我正在尝试创建一个权限为02770的目录,以便生成的权限为drwxrws---

当我运行以下命令时,我得到了预期的行为

代码语言:javascript
复制
rsam.svtest2.serendipity> (/home/svtest2)
$ mkdir abc


rsam.svtest2.serendipity> (/home/svtest2)
$ ls -lrt
drwxrwxr-x  2 svtest2 users    6 Apr 18 10:57 abc

rsam.svtest2.serendipity> (/home/svtest2)
$ chmod 02770 abc

rsam.svtest2.serendipity> (/home/svtest2)
$ ls -lrt
drwxrws---  2 svtest2 users    6 Apr 18 10:57 abc

UPDATE#1从上面开始,在目录上运行mkdir和chmod之后,当我运行chown时,SGID位将被清除。

代码语言:javascript
复制
rsam.svtest2.serendipity> (/home/svtest2)
$ chown svtest2:users abc



rsam.svtest2.serendipity> (/home/svtest2)
$ ls -lrt
drwxrwx---  2 svtest2 users    6 Apr 18 10:57 abc

chown文档

只有特权进程(Linux:具有CAP_CHOWN功能的进程)才能更改文件的所有者。文件的所有者可以将文件组更改为该所有者是其成员的任何组。特权进程(Linux: withCAP_CHOWN)可以任意更改组。

问题是我的用户svtest没有CAP_CHOWN功能。现在的问题归结为-我如何让用户拥有CAP_CHOWN功能?

看起来这里有一些说明-- 查城,但我还没试过。

但是,当我在C++代码下面运行时( tuxedo服务器的一部分)

代码语言:javascript
复制
// Check if the directory exists and if not creates the directory
// with the given permissions.
struct stat st;
int lreturn_code = stat(l_string, &st);



if (lreturn_code != 0 &&
    (mkdir(l_string, lpermission) != 0 ||
     chmod(l_string, lpermission) != 0)) {
     ....
     ....
     }
     ....
     ....
// Convert group name to group id into lgroup
        if (chown(l_string, -1, lgroup) != 0) {
            // System error.
        }

该目录创建如下:

代码语言:javascript
复制
$ ls -l|grep DirLevel1
drwxrwx--- 2 svtest2 users         6 Apr 18 11:14 DirLevel1

注意,在直接运行命令时,SGUID位没有像上面提到的那样设置。

手术的节选:

代码语言:javascript
复制
5864  stat("/home/svtest2/data/server/log/DirLevel1/", 0x7ffd235f29f0) = -1       ENOENT (No such file or directory)
5864  mkdir("/home/svtest2/data/server/log/DirLevel1/", 02770) = 0
5864  chmod("/home/svtest2/data/server/log/DirLevel1/", 02770) = 0
5864  socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 15
5864  connect(15, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
5864  close(15)                         = 0
5864  socket(PF_LOCAL, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 15
5864  connect(15, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"},  110) = -1 ENOENT (No such file or directory)
5864  close(15)                         = 0
5864  open("/etc/group", O_RDONLY|O_CLOEXEC) = 15
5864  fstat(15, {st_mode=S_IFREG|0644, st_size=652, ...}) = 0
5864  mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f414d7c4000
5864  read(15, "root:x:0:\nbin:x:1:\ndaemon:x:2:\ns"..., 4096) = 652
5864  close(15)                         = 0
5864  munmap(0x7f414d7c4000, 4096)      = 0
5864  chown("/home/svtest2/data/server/log/DirLevel1/", 4294967295, 100) = 0
5864  write(7, "\0\0\2~\6\0\0\0\0\0\21i\216\376\377\377\377\377\377\377\377\1\0\0\0\0\0\0\0\1\0\0"..., 638) = 638
5864  read(7, "\0\0\0\300\6\0\0\0\0\0\10\0\0\0\0\250\0\0\0\0\0\0\0\0\0(\0\0\0\0\0\0"..., 8208) = 192
5864  write(7, "\0\0\1}\6\0\0\0\0\0\3h\221\1\0\0\0\0\0\0\0\376\377\377\377\377\377\377\377\250\0\0"..., 381) = 381
5864  read(7, "\0\0\0\26\6\0\0\0\0\0\10\4\0\0\0\t\1\0\0\0\215\f", 8208) = 22
5864  msgsnd(43679799, {805306373, "y\0\0\0007\200\232\2\0\0\0\0\f\2\0\0\0\0\0\200\0\0\0\0\0\0\0\0\0\0\0\0"...}, 516, IPC_NOWAIT) = 0
5864  msgrcv(43614264,

来自http://man.sourcentral.org/RHEL7/2+chown

当非特权用户更改可执行文件的所有者或组时,将清除S_ISUID和S_ISGID模式位。POSIX没有指定在root执行chown()时是否也应该发生这种情况;Linux的行为取决于内核版本。对于非组可执行文件(即未设置S_IXGRP位的文件),S_ISGID位指示强制锁定,且未被chown()清除。

上面强调了一个可能的场景,但我不确定这如何适用于我的情况,因为它不是可执行文件,而是一个目录。

EN

回答 1

Stack Overflow用户

发布于 2016-04-19 03:51:24

由于*nix系统通过查看“x”权限位将文件视为可执行文件,因此我认为可搜索的目录也可能被视为可执行文件。

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

https://stackoverflow.com/questions/36700212

复制
相关文章

相似问题

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