Что самый легкий путь состоит в том, чтобы получить полное имя пользователя в системе Linux/POSIX?

Дело не в том, что NiFi не поддерживает собственные модули Python как таковые, скорее это движок Jython, который мы используем в NiFi (так как NiFi - это чистая реализация Java), который не поддерживает его. Если у вас есть интерпретатор Python на узле (ах), на котором работает NiFi, вы можете использовать ExecuteStreamCommand для оболочки на Python, используя свой скрипт (с собственным импортом), вы получите содержимое файла потока как stdin и Вы должны написать свою логику шифрования / дешифрования для вывода в stdout, который станет содержимым файла исходящего потока.

Я изучаю процессор Py4J, чтобы мы могли обойти ограничение Jython для собственных модулей, но вам все равно придется принести свой собственный Python (BYOP). На данный момент, пока вы не хотите делать что-то более сложное, чем получение содержимого потокового файла и выписка содержимого потокового файла, ExecuteStreamCommand должен выполнить свою задачу.

35
задан bignose 18 November 2011 в 16:52
поделиться

3 ответа

You don't specify a programming language, so I'll assume you want to use the shell; here's an answer for Posix shells.

Two steps to this: get the appropriate record, then get the field you want from that record.

First, getting the account record is done by querying the passwd table:

$ user_name=foo
$ user_record="$(getent passwd $user_name)"
$ echo "$user_record"
foo:x:1023:1025:Fred Nurk,,,:/home/foo:/bin/bash

For hysterical raisins, the full name of the user is recorded in a field called the “GECOS” field; to complicate matters, this field often has its own structure with the full name as just one of several optional sub-fields. So anything that wants to get the full name from the account record needs to parse both these levels.

$ user_record="$(getent passwd $user_name)"
$ user_gecos_field="$(echo "$user_record" | cut -d ':' -f 5)"
$ user_full_name="$(echo "$user_gecos_field" | cut -d ',' -f 1)"
$ echo "$user_full_name"
Fred Nurk

Your programming language probably has a library function to do this in fewer steps. In C, you'd use the ‘getpwnam’ function and then parse the GECOS field.

44
ответ дан 27 November 2019 в 06:38
поделиться

On a modern glibc system, use this command:

getent passwd "username" | cut -d ':' -f 5

That'll get you the passwd entry of the specified user, independent of the underlying NSS module.

Read the manpage of getent.


If you're already programming, you can use the getpwnam() C-Function:

struct passwd *getpwnam(const char *name);

The passwd struct has a pw_gecos member which should contain the full name of the user.

Read the manpage of getpwnam().


Be aware that many systems use this field for more than the full name of the user. The most common convention is to use a comma (,) as separator within the field and place the users real name first.

26
ответ дан 27 November 2019 в 06:38
поделиться

Just in case you want to do this from C, try something like this:

#include <sys/types.h>
#include <pwd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>

/* Get full name of a user, given their username. Return 0 for not found,
   -1 for error, or 1 for success. Copy name to `fullname`, but only up
   to max-1 chars (max includes trailing '\0'). Note that if the GECOS
   field contains commas, only up to to (but not including) the first comma
   is copied, since the commas are a convention to add more than just the
   name into the field, e.g., room number, phone number, etc. */
static int getfullname(const char *username, char *fullname, size_t max)
{
    struct passwd *p;
    size_t n;

    errno = 0;
    p = getpwnam(username);
    if (p == NULL && errno == 0)
        return 0;
    if (p == NULL)
        return -1;
    if (max == 0)
        return 1;
    n = strcspn(p->pw_gecos, ",");
    if (n > max - 1)
        n = max - 1;
    memcpy(fullname, p->pw_gecos, n);
    fullname[n] = '\0';
    return 1;
}

int main(int argc, char **argv)
{
    int i;
    int ret;
    char fullname[1024];

    for (i = 1; i < argc; ++i) {
        ret = getfullname(argv[i], fullname, sizeof fullname);
        if (ret == -1)
            printf("ERROR: %s: %s\n", argv[i], strerror(errno));
        else if (ret == 0)
            printf("UNKONWN: %s\n", argv[i]);
        else
            printf("%s: %s\n", argv[i], fullname);
    }
    return 0;
}
8
ответ дан 27 November 2019 в 06:38
поделиться
Другие вопросы по тегам:

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