你好我想了解chmod g+s
命令在Unix中的作用。
我还想知道它在这种特定情况下的作用:
cd /home/canard;
touch un;
chgrp canard .;
chmod g+s .;
touch deux ;
Run Code Online (Sandbox Code Playgroud)
我了解所有命令角色,除了chmod g+s
我想知道文件之间的差异un
以及deux
由这一系列命令产生的差异。
其流程去缓和权限通过setuid()
和setgid()
似乎没有继承的UID / GID他们设置了组成员。
我有一个必须以 root 身份执行才能打开特权端口的服务器进程;之后,它降级为特定的非特权 uid/gid,1——例如,用户的foo
(UID 73)。用户foo
是组的成员bar
:
> cat /etc/group | grep bar
bar:x:54:foo
Run Code Online (Sandbox Code Playgroud)
因此,如果我以 身份登录foo
,则可以读取/test.txt
具有以下特征的文件:
> ls -l /test.txt
-rw-r----- 1 root bar 10 Mar 8 16:22 /test.txt
Run Code Online (Sandbox Code Playgroud)
但是,std=gnu99
当运行 root 时,以下 C 程序(编译):
> cat /etc/group | grep bar
bar:x:54:foo
Run Code Online (Sandbox Code Playgroud)
总是报告Permission denied。我想这与它是一个非登录过程有关,但它有点阻碍了权限应该工作的方式。
1. 这通常是服务器的 SOP,我认为必须有办法解决这个问题,因为我发现有人用 apache 做这件事的报告——apache 已被添加到音频组中,然后显然可以使用声音系统。当然,这可能发生在 fork 而不是原始进程中,但实际上在我的上下文中情况相同(它是在 setuid 调用之后派生的子进程)。
chmod
在取消设置 setgid 位时,我刚刚注意到一些有趣的行为:
$ mkdir test
$ chmod 2755 test
$ stat -c '%a %n' test
2755 test # as expected
$ chmod 0755 test
$ stat -c '%a %n' test
2755 test # what? see below
$ chmod 00755 test
$ stat -c '%a %n' test
755 test # double what?!
Run Code Online (Sandbox Code Playgroud)
尝试取消设置 setgid 位chmod 0755
不起作用,这令人惊讶。但是,手册页表明这是预期的行为:
SETUID 和 SETGID 位
如果文件的组 ID 与用户的有效组 ID 或用户的补充组 ID 之一不匹配,则 chmod 清除常规文件的 set-group-ID 位,除非用户具有适当的权限。其他限制可能会导致 MODE 或 RFILE 的 set-user-ID 和 …
试图理解为什么 ssh-agent 有 sgid 位并发现这篇文章ssh-agent has sgid
我还有一个问题,为什么ssh-agent的组所有权是nobody not root?背后的原因是什么?如果组所有权是根,它仍然有效吗?
我setuid
在二进制可执行文件上得到它允许进程获取二进制所有者的有效 uid。我无法理解的是,对于特定的可执行文件,如果setuid
位关闭但setgid
位打开会怎样。在这种情况下会发生什么?
示例:假设我们有以下权限
ls -l my_bin
r-xr-s--- root wheel my_bin
Run Code Online (Sandbox Code Playgroud)
现在假设用户userA
是 group 的成员wheel
。userA
尝试运行此程序时会发生什么?
我认为此进程的有效用户 ID 将uid
与 name 用户相同wheel
。这是一个人为的例子,但我对组权限如何改变有效 uid 或它们是否对有效 uid 有任何影响感到困惑。
我无法设置其他人的 setuid 位。为什么?有安全锁吗?
$ ls -l
-rwxrwxr-x 1 allexj allexj 16784 Mar 11 17:30 a.out
$ chmod o=+s a.out
$ ls -l
-rwxrwx--- 1 allexj allexj 16784 Mar 11 17:30 a.out
Run Code Online (Sandbox Code Playgroud) 我有一个特权 C 程序,它由标准用户(例如stduser
)执行并在执行时切换到系统用户(例如sysuser
),如下所示。基本上,我正在尝试做一些类似于sudo -u sysuser env
会做的事情。
环境测试.c:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<errno.h>
#include<shadow.h>
#include<pwd.h>
int main(void){
struct passwd*pw;
uid_t sysuid;
gid_t sysgid;
char err_module_name[256] = "";
pw = getpwnam ("ayauser");
endpwent();
if (!pw){ //user doesn't really exist
perror("getpwnam()");
return errno;
}
sysuid = pw->pw_uid;
sysgid = pw->pw_gid;
(strcpy(err_module_name, "setregid()") == NULL || setregid(sysgid, sysgid) == 0) &&
(strcpy(err_module_name, "setreuid()") == NULL || setreuid(sysuid, sysuid) == 0) &&
(strcpy(err_module_name, "execl()") == NULL || execl("/usr/bin/env", …
Run Code Online (Sandbox Code Playgroud)