Scroll to navigation

utmp(5) File Formats Manual utmp(5)

الاسم

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

موجز

#include <utmp.h>

الوصف

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

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

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


/* قيم حقل ut_type، أدناه */
#define EMPTY         0 /* السجل لا يحتوي على معلومات صالحة

(كان يُعرف سابقًا بـ UT_UNKNOWN على لينكس) */ #define RUN_LVL 1 /* تغيير في مستوى تشغيل النظام (انظر
init(1)) */ #define BOOT_TIME 2 /* وقت إقلاع النظام (في ut_tv) */ #define NEW_TIME 3 /* الوقت بعد تغيير ساعة النظام
(في ut_tv) */ #define OLD_TIME 4 /* الوقت قبل تغيير ساعة النظام
(في ut_tv) */ #define INIT_PROCESS 5 /* عملية تم إنشاؤها بواسطة init(1) */ #define LOGIN_PROCESS 6 /* عملية قائد الجلسة لتسجيل دخول المستخدم */ #define USER_PROCESS 7 /* عملية عادية */ #define DEAD_PROCESS 8 /* عملية منتهية */ #define ACCOUNTING 9 /* غير مطبق */ #define UT_LINESIZE 32 #define UT_NAMESIZE 32 #define UT_HOSTSIZE 256 struct exit_status { /* نوع لـ ut_exit، أدناه */
short e_termination; /* حالة إنهاء العملية */
short e_exit; /* حالة خروج العملية */ }; struct utmp {
short ut_type; /* نوع السجل */
pid_t ut_pid; /* PID لعملية تسجيل الدخول */
char ut_line[UT_LINESIZE]; /* اسم جهاز tty - "/dev/" */
char ut_id[4]; /* لاحقة اسم الطرفية،
أو معرف inittab(5) */
char ut_user[UT_NAMESIZE]; /* اسم المستخدم */
char ut_host[UT_HOSTSIZE]; /* اسم المضيف لتسجيل الدخول عن بُعد، أو
إصدار النواة لرسائل مستوى التشغيل */
struct exit_status ut_exit; /* حالة خروج عملية
موسومة بـ DEAD_PROCESS؛ لا
تُستخدم بواسطة لينكس init(1) */
/* يجب أن يكون حقلا ut_session و ut_tv بنفس الحجم عند
الترجمة لـ 32-بت و64-بت. يسمح هذا بمشاركة ملفات البيانات والذاكرة
المشتركة بين تطبيقات 32-بت و64-بت. */ #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
int32_t ut_session; /* معرف الجلسة (getsid(2)
يُستخدم للنوافذ */
struct {
int32_t tv_sec; /* الثواني */
int32_t tv_usec; /* الميكروثواني */
} ut_tv; /* وقت إنشاء الإدخال */ #else
long ut_session; /* معرف الجلسة */
struct timeval ut_tv; /* وقت إنشاء الإدخال */ #endif
int32_t ut_addr_v6[4]; /* عنوان الإنترنت للمضيف
البعيد؛ عنوان IPv4 يستخدم
فقط ut_addr_v6[0] */
char __unused[20]; /* محجوز للاستخدام المستقبلي */ }; /* حيل التوافق العكسي */ #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 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

15 يونيو 2024 صفحات دليل لينكس 6.9.1