代码之家  ›  专栏  ›  技术社区  ›  Juri

seteuid()不工作。原因?

  •  0
  • Juri  · 技术社区  · 17 年前

    我对C完全陌生,很少使用它。这次我需要它来做一个大学项目。我必须编写一个小的C应用程序来测试我们在Linux内核(在调度器上)上所做的一些修改。

    在脚本中,我想切换到另一个用户,以查看不同用户之间的CPU时间分布。所以我用根权限(即sudo/myapp)启动我的小C程序。在程序内部-在我执行了一些需要根权限的操作之后-我想通过调用seteuid(1000)或setuid(1000)切换回另一个uid,其中1000是现有用户的ID(我以前登录的用户)。然而,这个调用似乎没有任何效果,它也没有抛出任何异常。 这是我写的一个示例,只是为了测试uid切换:

    #define _POSIX_SOURCE
    #include <pwd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sched.h>
    #include <unistd.h>
    #include <string>
    #include <time.h>
    
    using namespace std;
    
    
    int main(int argc, char *argv[])
    {
        int uid;
        struct passwd *p;
    
        if ((p = getpwuid(uid = getuid())) == NULL){
                perror("getpwuid() error");
                exit(1);
        }
    
        printf("***************************************\n");
        printf("Executing user: %s (%d)\n", p->pw_name, p->pw_uid);
        printf("***************************************\n");
    
        seteuid(1000);
    
        if ((p = getpwuid(uid = getuid())) == NULL){
                perror("getpwuid() error");
                exit(1);
        }
    
        printf("***************************************\n");
        printf("Executing user: %s (%d)\n", p->pw_name, p->pw_uid);
        printf("***************************************\n");
    
        return 0;
    }
    

    有人知道为什么它不起作用吗??非常感谢您的帮助!谢谢

    //编辑: 修改了CHSH提到的代码

    1 回复  |  直到 17 年前
        1
  •  3
  •   chsh    17 年前

    我认为它工作得很好,代码中的逻辑有问题,因为您要将getuid()的值捕获到passwd结构中,然后在调用seteuid()后不检索的情况下只显示两次。