seteuid () не работает. Причина? - PullRequest
0 голосов
/ 31 июля 2009

Я совершенно новичок в C и использую его очень редко. На этот раз мне это нужно для университетского проекта. Я должен написать небольшое приложение c, которое тестирует некоторые модификации, которые мы сделали в ядре Linux (в планировщике).

Внутри скрипта я бы хотел переключиться на другого пользователя, чтобы увидеть распределение времени процессора между разными пользователями. Поэтому я запускаю свою маленькую прогу C с правами root (т.е. с sudo ./myapp). Внутри проги - после того, как я выполнил некоторые операции, для которых нужны права root, - я бы хотел переключиться обратно на другой uid, вызвав seteuid (1000) или setuid (1000), где 1000 - это идентификатор существующего пользователя (которого я использовал для входа на). Однако вызов, кажется, не имеет никакого эффекта, он также не выдает никаких исключений. Вот пример, который я написал, чтобы проверить переключение 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;
}

Кто-нибудь знает, почему это не сработает ?? Любая помощь высоко ценится! Thx

// Изменить: Исправленный код, упомянутый в chsh

1 Ответ

3 голосов
/ 31 июля 2009

Я думаю, что все работает нормально, есть проблема с логикой в ​​коде, потому что вы записываете значение getuid () в структуру passwd, а затем просто отображаете его дважды, не получая его снова после вызова seteuid ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...