ما هي أسهل طريقة للحصول على اسم المستخدم الكامل على لينكس/POSIX النظام ؟

StackOverflow https://stackoverflow.com/questions/833227

سؤال

أنا يمكن أن البقرى خلال /etc/passwd ولكن يبدو أن المرهقة."إصبع" لم يتم تثبيت وأود أن تجنب التبعية.هذا هو البرنامج لذلك سيكون من الرائع إذا كان هناك بعض الأوامر التي تسمح لك الوصول إلى معلومات المستخدم.

هل كانت مفيدة؟

المحلول

لم تحدد لغة البرمجة لذا سوف نفترض أنك ترغب في استخدام شل ؛ هنا إجابة على Posix قذائف.

خطوتين إلى هذا:الحصول على السجل المناسب ، ثم الحصول على الحقل الذي تريد من هذا السجل.

أولا الحصول على سجل حساب به الاستعلام عن passwd الجدول:

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

بالنسبة هستيري الزبيب ، الاسم الكامل للمستخدم تسجل في حقل يسمى "GECOS" الميدان;إلى تعقيد الأمور هذا المجال وغالبا ما هيكلها مع الاسم الكامل كما هو مجرد واحدة من العديد من اختياري الحقول الفرعية.لذلك أي شيء يريد الحصول على الاسم الكامل من حساب سجل يحتاج إلى تحليل كل من هذه المستويات.

$ 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

الخاص بك لغة البرمجة ربما لديه وظيفة المكتبة للقيام بذلك في عدد أقل من الخطوات.في C, كنت استخدم getpwnam وظيفة ومن ثم تحليل GECOS المجال.

نصائح أخرى

في نظام سي العمومية الحديثة، استخدم هذا الأمر:

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

وهذا سوف تحصل على دخول passwd المستخدم المحدد، بغض النظر عن وحدة NSS الأساسية.

manpage من getent .


إذا كنت البرمجة بالفعل، يمكنك استخدام getpwnam() C-الفعل:

struct passwd *getpwnam(const char *name);

ووالبنية passwd ديها عضوا pw_gecos التي يجب أن تحتوي على الاسم الكامل للمستخدم.

من getpwnam() .


وانتبه إلى أن العديد من أنظمة تستخدم هذا المجال لأكثر من الاسم الكامل للمستخدم. الاتفاقية الأكثر شيوعا هو استخدام فاصلة (,) كفاصل داخل الميدان ووضع المستخدمين اسمه الحقيقي أولا.

وفقط في حال كنت ترغب في القيام بذلك من C، حاول شيئا من هذا القبيل:

#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;
}

والجمع بين إجابات أخرى، واختبارها على الحد الأدنى من المنشآت ديبيان / أوبونتو:

getent passwd `whoami` | cut -d ':' -f 5 | cut -d ',' -f 1

وجرب هذا:

getent passwd eutl420 | awk -F':' '{gsub(",", "",$5); print $5}'

واثنين من كبار إجابات يمكن الجمع في سطر واحد:

getent passwd <username> | cut -d ':' -f 5 | cut -d ',' -f 1

ورمزي يعمل في باش و شلن كيني، ولكن ليس اندفاعة أو قذيفة بورن القديمة. يقرأ مجالات أخرى أيضا، في حال كنت قد ترغب بها.

IFS=: read user x uid gid gecos hm sh < <( getent passwd $USER )
name=${gecos%%,*}
echo "$name"

ويمكن أيضا مسح كامل / الخ / ملف باسود. هذا وتعمل في سهل قذيفة بورن، في 1 عملية، ولكن ليس كثيرا مع LDAP أو ما.

while IFS=: read user x uid gid gecos hm sh; do
  name=${gecos%%,*}
  [ $uid -ge 1000 -a $uid -lt 60000 ] && echo "$name"
done < /etc/passwd

من ناحية أخرى، وذلك باستخدام أدوات غير جيد. وC هو جيد جدا.

والطريقة التي أنا أحسب أنه على لينكس للحصول على الاسم الكامل إلى متغير كانت في:

u_id=`id -u`
uname=`awk -F: -vid=$u_id '{if ($3 == id) print $5}' /etc/passwd`

استخدم بعد ذلك فقط بسيط المتغير، مثلا: $ echo $uname

وتأخذ 1:

$ user_name=sshd
$ awk -F: "\$1 == \"$user_name\" { print \$5 }" /etc/passwd
Secure Shell Daemon

ومع ذلك، تدعم قاعدة بيانات باسود طابع خاص '&' في GECOS، والتي ينبغي استبدالها قيمة رسملة اسم المستخدم:

$ user_name=operator
$ awk -F: "\$1 == \"$user_name\" { print \$5 }" /etc/passwd
System &

ومعظم الأجوبة هنا (باستثناء حل الإصبع) لا تحترم و. إذا كنت ترغب في دعم هذه القضية، ثم عليك ان تحصل على السيناريو أكثر تعقيدا.

وتأخذ 2:

$ user_name=operator
$ awk -F: "\$1 == \"$user_name\" { u=\$1; sub(/./, toupper(substr(u,1,1)), u);
    gsub(/&/, u, \$5); print \$5 }" /etc/passwd
System Operator

ووحسن البالغ من العمر <م> الاصبع قد يساعد أيضا: -)

finger $USER |head -n1 |cut -d : -f3
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top