utmp(5)

الاسم
utmp, wtmp - سجلات الدخول

موجز
#include <utmp.h>

الوصف
يسمح ملف utmp باكتشاف معلومات حول من يستخدم النظام حالياً. قد يكون هناك مستخدمون إضافيون يستخدمون النظام حالياً، لأن ليست كل البرامج تستخدم تسجيل utmp.

تحذير: لا يجب أن يكون utmp قابلاً للكتابة من قبل فئة المستخدم "آخرون"، لأن العديد من برامج النظام (بشكل أحمق) تعتمد على سلامته. تخاطر بسجلات نظام مزيفة وتعديلات لملفات النظام إذا تركت utmp قابلاً للكتابة لأي مستخدم غير المالك ومالك المجموعة للملف.

الملف هو تسلسل من بنى utmp، المُعلنة كما يلي في <utmp.h> (لاحظ أن هذا مجرد تعريف واحد من عدة تعريفات موجودة؛ التفاصيل تعتمد على إصدار libc):

    /* Values for ut_type field, below */

    #define EMPTY         0 /* Record does not contain valid info
                               (formerly known as UT_UNKNOWN on Linux) */
    #define RUN_LVL       1 /* Change in system run-level (see
                               init(1)) */
    #define BOOT_TIME     2 /* Time of system boot (in ut_tv) */
    #define NEW_TIME      3 /* Time after system clock change
                               (in ut_tv) */
    #define OLD_TIME      4 /* Time before system clock change
                               (in ut_tv) */
    #define INIT_PROCESS  5 /* Process spawned by init(1) */
    #define LOGIN_PROCESS 6 /* Session leader process for user login */
    #define USER_PROCESS  7 /* Normal process */
    #define DEAD_PROCESS  8 /* Terminated process */
    #define ACCOUNTING    9 /* Not implemented */

    #define UT_LINESIZE      32
    #define UT_NAMESIZE      32
    #define UT_HOSTSIZE     256

    struct exit_status {              /* Type for ut_exit, below */
        short e_termination;          /* Process termination status */
        short e_exit;                 /* Process exit status */
    };

    struct utmp {
        short   ut_type;              /* Type of record */
        pid_t   ut_pid;               /* PID of login process */
        char    ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */
        char    ut_id[4];             /* Terminal name suffix,
                                         or inittab(5) ID */
        char    ut_user[UT_NAMESIZE]; /* Username */
        char    ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or
                                         kernel version for run-level
                                         messages */
        struct  exit_status ut_exit;  /* Exit status of a process
                                         marked as DEAD_PROCESS; not
                                         used by Linux init(1) */
        /* The ut_session and ut_tv fields must be the same size when
           compiled 32- and 64-bit.  This allows data files and shared
           memory to be shared between 32- and 64-bit applications.  */
    #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
        int32_t ut_session;           /* Session ID (
    getsid(2)),
                                         used for windowing */
        struct {
            int32_t tv_sec;           /* Seconds */
            int32_t tv_usec;          /* Microseconds */
        } ut_tv;                      /* Time entry was made */
    #else
         long   ut_session;           /* Session ID */
         struct timeval ut_tv;        /* Time entry was made */
    #endif

        int32_t ut_addr_v6[4];        /* Internet address of remote
                                         host; IPv4 address uses
                                         just ut_addr_v6[0] */
        char __unused[20];            /* Reserved for future use */
    };

    /* Backward compatibility hacks */
    #define ut_name ut_user
    #ifndef _NO_UT_TIME
    #define ut_time ut_tv.tv_sec
    #endif
    #define ut_xtime ut_tv.tv_sec
    #define ut_addr ut_addr_v6[0]

تعطي هذه البنية اسم الملف الخاص المرتبط بطرفية المستخدم، واسم دخول المستخدم، ووقت الدخول بصيغة time(2). تُنهى حقول السلسلة ببايت فارغ ('\0') إذا كانت أقصر من حجم الحقل.

تنتج الإدخالات الأولى التي تُنشأ من معالجة init(1) لـ inittab(5). قبل معالجة إدخال، مع ذلك، ينظف init(1) utmp عن طريق تعيين ut_type إلى DEAD_PROCESS، ومسح ut_user و ut_host و ut_time ببايتات فارغة لكل سجل يكون ut_type فيه ليس DEAD_PROCESS أو RUN_LVL وحيث لا توجد عملية بمعرف PID ut_pid. إذا لم يُعثر على سجل فارغ بمعرف ut_id المطلوب، ينشئ init(1) سجلاً جديداً. يعيّن ut_id من inittab، و ut_pid و ut_time إلى القيم الحالية، و ut_type إلى INIT_PROCESS.

يحدد mingetty(8) (أو agetty(8)) الإدخال بواسطة PID، ويغير ut_type إلى LOGIN_PROCESS، ويغير ut_time، ويعيّن ut_line، وينتظر إنشاء الاتصال. بعد مصادقة المستخدم، يغير login(1) ut_type إلى USER_PROCESS، ويغير ut_time، ويعيّن ut_host و ut_addr. اعتماداً على mingetty(8) (أو agetty(8)) و login(1)، قد تُحدد السجلات بواسطة ut_line بدلاً من ut_pid المفضل.

عندما يجد init(1) أن عملية قد خرجت، يحدد إدخال utmp الخاص بها بواسطة ut_pid، ويعيّن ut_type إلى DEAD_PROCESS، ويمسح ut_user و ut_host و ut_time ببايتات فارغة.

ينشئ xterm(1) ومحاكيات طرفية أخرى مباشرة سجلاً من نوع USER_PROCESS ويولّد ut_id باستخدام السلسلة التي تشكل جزء اللاحقة من اسم الطرفية (الأحرف التي تلي /dev/[pt]ty). إذا وجدوا DEAD_PROCESS لهذا المعرف، يعيدون استخدامه، وإلا ينشئون إدخالاً جديداً. إذا استطاعوا، سيوسمونه كـ DEAD_PROCESS عند الخروج ويُنصح بأن يفرغوا ut_line و ut_time و ut_user و ut_host أيضًا.

ينشئ telnetd(8) إدخالاً من نوع LOGIN_PROCESS ويترك الباقي لـ login(1) كالمعتاد. بعد انتهاء جلسة telnet، ينظف telnetd(8) utmp بالطريقة الموصوفة.

يسجل ملف wtmp جميع عمليات الدخول والخروج. تنسيقه تماماً مثل utmp باستثناء أن اسم مستخدم فارغ يشير إلى خروج على الطرفية المرتبطة. علاوة على ذلك، يشير اسم الطرفية ~ مع اسم المستخدم shutdown أو reboot إلى إيقاف تشغيل النظام أو إعادة تشغيله، ويسجل زوج أسماء الطرفيات |/} وقت النظام القديم/الجديد عندما يغيره date(1). تتم صيانة wtmp بواسطة login(1) و init(1) وبعض إصدارات getty(8) (مثل mingetty(8) أو agetty(8)). لا ينشئ أي من هذه البرامج الملف، لذا إذا أُزيل، يتم إيقاف حفظ السجلات.

الملفات
/var/run/utmp
/var/log/wtmp

الإصدارات
لا يحدد معيار POSIX.1 بنية utmp، بل يحدد بنية باسم utmpx (كجزء من امتداد XSI)، مع مواصفات للحقول ut_type و ut_pid و ut_line و ut_id و ut_user و ut_tv. ولا يحدد معيار POSIX.1 أطوال الحقلين ut_line و ut_user.

يُعرّف نظام لينكس بنية utmpx لتكون مطابقة لبنية utmp.

المعايير
لينكس.

التاريخ
لا تتوافق مدخلات utmp في لينكس مع معيار v7/BSD ولا مع System V؛ بل هي مزيج من الاثنين.

يحتوي نظام v7/BSD على حقول أقل؛ والأهم من ذلك أنه يفتقر إلى ut_type، مما يؤدي ببرامج v7/BSD الأصلية إلى عرض (على سبيل المثال) مدخلات ميتة أو مدخلات تسجيل دخول. علاوة على ذلك، لا يوجد ملف تهيئة يخصص خانات للجلسات. يقوم نظام BSD بذلك لأنه يفتقر إلى حقول ut_id.

في لينكس (كما في نظام System V)، لن يتغير حقل ut_id الخاص بسجل ما بمجرد ضبطه، مما يحجز تلك الخانة دون الحاجة إلى ملف تهيئة. قد يؤدي مسح حقل ut_id إلى حدوث حالات تضارب (race conditions) تؤدي إلى تلف مدخلات utmp وثغرات أمنية محتملة. إن مسح الحقول المذكورة أعلاه عن طريق ملئها ببايتات فارغة (null bytes) ليس مطلوبًا وفق دلالات System V، ولكنه يجعل من الممكن تشغيل العديد من البرامج التي تفترض دلالات BSD والتي لا تعدّل utmp. يستخدم لينكس اصطلاحات BSD لمحتويات السطر، كما هو موثق أعلاه.

لا يحتوي نظام System V على حقول ut_host أو ut_addr_v6.

ملاحظات
على عكس العديد من الأنظمة الأخرى التي يمكن فيها تعطيل سجل utmp عن طريق حذف الملف، يجب أن يكون ملف utmp موجودًا دائمًا في لينكس. إذا كنت ترغب في تعطيل الأمر who(1)، فقم بضبط صلاحيات الملف بحيث لا يكون قابلاً للقراءة من قبل الجميع (world readable).

تنسيق الملف معتمد على الجهاز، لذا يُوصى بمعالجته فقط على بنية الجهاز التي أُنشئ فيها.

لاحظ أنه على منصات biarch، أي الأنظمة التي يمكنها تشغيل تطبيقات 32-بت و64-بت (x86-64, ppc64, s390x، إلخ)، يكون حجم ut_tv نفسه في وضع 32-بت كما في وضع 64-بت. وينطبق الشيء نفسه على ut_session وut_time إذا كانا موجودين. يسمح هذا بمشاركة ملفات البيانات والذاكرة المشتركة بين تطبيقات 32-بت و64-بت. يُحقق هذا بتغيير نوع ut_session إلى int32_t، ونوع ut_tv إلى هيكل بحقلين int32_t هما tv_sec وtv_usec. وبما أن ut_tv قد لا يكون مطابقًا لـ struct timeval، فبدلاً من الاستدعاء:

    gettimeofday((struct timeval *) &ut.ut_tv, NULL);

يُوصى بالطريقة التالية لتعيين هذا الحقل:

    struct utmp ut;
    struct timeval tv;

    gettimeofday(&tv, NULL);
    ut.ut_tv.tv_sec = tv.tv_sec;
    ut.ut_tv.tv_usec = tv.tv_usec;

انظر أيضًا
ac(1), date(1), init(1), last(1), login(1), logname(1), lslogins(1), users(1), utmpdump(1), who(1), getutent(3), getutmp(3), login(3), logout(3), logwtmp(3), updwtmp(3)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.