Программирование Unix. Не уверенный, как использовать passwd структуру

Возможно, это могло бы помочь: JSefa

можно прочитать файл CSV с этим инструментом и сериализировать его к XML.

5
задан Bryan Harrington 22 October 2009 в 21:55
поделиться

3 ответа

В сигнатуре getpwuid_r :

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, 
    size_t buflen, struct passwd **pwbufp);

uid - это входной параметр - это UID пользователя, которого вы хотите найти. Остальные, по сути, являются выходными параметрами: структура, на которую указывает pwbuf , будет заполнена паролем, а указатель, на который указывает pwbufp , будет установлен на значение pwbuf , если вызов был успешным (и NULL , если это не было). Пара параметров buf и buflen задает предоставленный пользователем буфер, который будет использоваться для хранения строк, на которые указывают члены структуры struct passwd , которая является возвращается.

Вы могли бы использовать это так (это ищет пользователя с UID 101):

    struct passwd pwent;
    struct passwd *pwentp;
    char buf[1024];

    if (getpwuid_r(101, &pwent, buf, sizeof buf, &pwentp))
    {
            perror("getpwuid_r");
    }
    else
    {
            printf("Username: %s\n", pwent.pw_name);
            printf("Real Name: %s\n", pwent.pw_gecos);
            printf("Home Directory: %s\n", pwent.pw_dir);
    }

Если вы хотите найти пользователя по имени, чтобы найти его ID,

7
ответ дан 14 December 2019 в 01:11
поделиться

Во-первых, если вы хотите получить UID, то, вероятно, у вас есть имя пользователя под рукой , в этом случае вы должны использовать вместо него getpwnam_r () . Эта функция используется точно так же, как getpwuid_r () , за исключением того, что вы передаете ей имя ( char *) в качестве первого параметра.

Во-вторых, вам не нужно объявлять ` struct passwd '. Он объявляется при включении pwd.h.

В-третьих, точная сигнатура функции:

int getpwnam_r(const char *name, struct passwd *pwd,
               char *buf, size_t buflen, struct passwd **result);

В приведенном выше примере pwd - это параметр вывода . Вот где функция возвращает ваш пароль, если он найден.

Наконец,

1
ответ дан 14 December 2019 в 01:11
поделиться

Хорошо, во-первых, я не совсем уверен, чего вы пытаетесь достичь - вы сказали, что вам нужно получить uid, но getpwuid предназначен для поиска другой информации на основе uid . Вы, может быть, хотели getpwnam, который ищет по имени пользователя? И тогда вам нужно использовать uid для другой функции?

В любом случае, все, что я говорю ниже, применимо как к getpwnam, так и к getpwuid - просто замените аргумент uid аргументом имени пользователя.

Вы перепутали свои документации немного. Почти цитата из справочной страницы:

struct passwd *getpwuid(uid_t uid);

int getpwuid_r(uid_t uid, struct passwd *pwbuf, char *buf, size_t buflen, struct passwd **pwbufp);

Функция getpwuid () возвращает указатель на структуру, содержащую выделенные поля записи в базе данных паролей, которая соответствует идентификатору пользователя uid.

Функция getpwuid_r () функция получает ту же информацию, но сохраняет полученную структуру passwd в пространстве, на которое указывает pwbuf.

Похоже, вы просто немного нечетко разбираетесь в указателях. Однако вам не нужно слишком сильно беспокоиться об этой работе, похоже, для ваших целей более простая версия может подойти:

struct passwd * my_passwd;
my_passwd = getpwuid(uid);
// or:
// my_passwd = getpwnam(username);

if (my_passwd == NULL) {
    // the lookup failed - handle the error!
} else {
    // the lookup succeeded - do your thing 
    printf("User name: %s\n", my_passwd->pw_name);
    printf("User password: %s\n", my_passwd->pw_passwd);
    ...
}

Обратите внимание, что в этом случае вам не нужно выделять память для указателя, потому что getpwuid возвращает указатель на структуру с выделенной памятью и сохраненной информацией.

Полное определение структуры (имена других членов) находится на странице руководства.

Вторая форма, getpwuid_r, лучше подходит для более тщательной проверки ошибок - обработки и управления памятью, но если все, что вам нужно сделать, это быстрый поиск, это должно быть нормально.

1
ответ дан 14 December 2019 в 01:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: