我可以在命令中获得与 EUID 不同的 UID 和与 EGID 不同的 GID 吗?

Can I get a different UID than EUID and GID than EGID in a command?

我有一个程序可以获取自己的 UID、EUID、GID、EGID,我想获取 UID!=EUID 和 GID!=EGID。

我试过更改程序文件的所有者和组,但我总是得到相同的结果。

C代码如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    char cad[128];

    pid_t pid;
    pid = getpid();

    char s1[] = "ps -p ";
    char s2[] = " -o cmd,pid,ppid,uid,euid,gid,egid,pri,stat";
    char spid[42];
    sprintf(spid, "%d", (int)pid);
    char result[2048];

    strcpy(result, s1);
    strcat(result, spid);
    strcat(result, s2);

    sprintf(cad,"Program %s started.\n",argv[0]);
    write(1,cad,strlen(cad));

    system(result);

    read(0,cad,1);

    sprintf(cad,"Program %s ended.\n",argv[0]);
    write(1,cad,strlen(cad));

    exit(0);
}

我试过的命令是:

$ sudo chown 2000 filename
$ sudo chgrp 2000 filename
$ sudo chmod u+r,g+x filename

然后执行编译好的程序。总是得到:

Program ./pgm1_1_1 started.
CMD                           PID  PPID   UID  EUID   GID  EGID PRI STAT
./pgm1_1_1                  18216 17683  1000  1000  1000  1000  19 S+

您没有在权限中设置 SUID 和 SGID 位:

sudo chmod ug+s filename

或者,一次完成权限设置,您可以使用以下任一方法:

sudo chmod 6755 filename              # Numeric permissions (octal)
sudo chmod a=rx,u+w,ug+s filename     # Symbolic permissions

您应该运行 ls -l filename 完成权限设置后。设置 SUID 和 SGID 位后,您应该会看到如下内容:

-rwsr-sr-x  1 2000  2000  8712 May  8 00:18 filename

其中两个 s 值在权限中至关重要。你可能有我可以看到 UID 和 GID 编号的名字。