libinput-record(1) General Commands Manual libinput-record(1)

libinput-record - ضبط و ذخیره رویدادهای خام دستگاه‌های ورودی در لینوکس

libinput record [گزینه‌ها] [/dev/input/event0 [/dev/input/event1 ...]]

ابزار libinput record رویدادهای هسته (Kernel) را از یک دستگاه ورودی ضبط کرده و آن‌ها را در قالبی چاپ می‌کند که بعداً با ابزار libinput-replay(1) قابل بازپخش باشد. این ابزار برای خواندن اطلاعات مستقیم از دستگاه به دسترسی ریشه (root) نیاز دارد.

خروجی این ابزار با فرمت YAML است؛ برای جزئیات بیشتر بخش قالب فایل (FILE FORMAT) را ببینید. به‌طور پیش‌فرض خروجی در خروجی استاندارد (stdout) چاپ می‌شود مگر اینکه یک فایل خروجی مشخص شده باشد. به عنوان مثال، دستورات زیر معتبر هستند:

libinput record /dev/input/event3 touchpad.yml

libinput record recording.yml

libinput record --all all-devices.yml

libinput record /dev/input/event3 /dev/input/event4 tp-and-keyboard.yml

رویدادهای ضبط‌شده مستقل از خود libinput هستند؛ ارتقا یا حذف libinput تغییری در جریان رویدادها ایجاد نخواهد کرد.

اگر یک یا چند گره دستگاه (device node) مشخص شوند، این ابزار آن گره‌ها را باز می‌کند. در غیر این صورت، فهرستی از دستگاه‌های موجود نمایش داده می‌شود و کاربر می‌تواند دستگاه مورد نظر را برای ضبط انتخاب کند. در صورت عدم اطمینان، دستور را بدون هیچ آرگومانی اجرا کنید.

نمایش راهنمای دستور
ضبط تمام دستگاه‌های /dev/input/event* موجود در سیستم. از این گزینه فقط باید در موارد استثنایی استفاده شود، زیرا فایل خروجی معمولاً بیش از حد شلوغ بوده و بازپخش آن ممکن است امکان‌پذیر نباشد. این گزینه نیازمند --output-file است و هیچ گره دستگاهی نباید در خط فرمان مشخص شود.
توقف ضبط جاری پس از گذشت s ثانیه عدم فعالیت دستگاه. این گزینه مستلزم مشخص بودن --output-file است. نام فایل خروجی به عنوان پیشوند استفاده شده و تاریخ و زمان ضبط به انتهای آن اضافه می‌شود. مقدار زمان انقضا باید بزرگ‌تر از ۰ باشد.
مشخص کردن فایل خروجی مورد استفاده. اگر --autorestart مشخص شده باشد، نام فایل فقط به عنوان پیشوند به کار می‌رود. در صورتی که --output-file مشخص نشود و اولین یا آخرین آرگومان یک دستگاه ورودی نباشد، آن آرگومان اول یا آخر به عنوان فایل خروجی در نظر گرفته خواهد شد.
تصاحب انحصاری (Exclusive Grab) تمام دستگاه‌های بازشده. این کار از ارسال رویدادها به سیستم میزبان جلوگیری می‌کند.
نمایش کدهای کلید (Keycodes) به صورت دست‌نخورده در ضبط. به صورت پیش‌فرض، کلیدهای متداول برای جلوگیری از افشای اطلاعات حساس مبهم‌سازی شده و به صورت KEY_A چاپ می‌شوند.
ضبط رویدادهای libinput در کنار رویدادهای دستگاه. این ویژگی آزمایشی است. برای جزئیات بیشتر بخش ضبط رویدادهای LIBINPUT را ببینید.
ضبط رویدادهای hidraw در کنار رویدادهای دستگاه. اطلاعات حساس را تایپ نکنید. برای جزئیات بیشتر بخش ضبط گزارش‌های HID را ببینید.

گاهی اوقات ضبط همزمان رویدادهای چندین دستگاه ضروری است؛ مثلاً زمانی که تداخل بین تاچ‌پد و صفحه‌کلید باعث بروز یک باگ می‌شود. libinput record چندین دستگاه را با اختلاف زمانی یکسان ضبط می‌کند که امکان بازپخش دقیق تعامل آن‌ها را فراهم می‌سازد.

اگر چندین دستگاه ضبط شوند، حتماً باید یک نام فایل خروجی ارائه گردد.

تمام دستگاه‌های مورد نظر برای ضبط باید در خط فرمان مشخص شوند. نمونه‌ای از نحوه فراخوانی:

libinput record -o tap-bug /dev/input/event3 /dev/input/event7

توجه داشته باشید که هنگام ضبط چندین دستگاه، فقط اطلاعات دستگاه اول بلافاصله چاپ می‌شود و تمام دستگاه‌های دیگر و رویدادهایشان در زمان خروج از برنامه چاپ خواهند شد.

هنگامی که گزینه خط فرمان --with-libinput داده شود، libinput-record یک کانتکست libinput برای دستگاه‌های در حال ضبط ایجاد می‌کند. رویدادهای این کانتکست‌ها در کنار رویدادهای evdev چاپ می‌شوند. این ویژگی آزمایشی است.

هدف اصلی این ویژگی اشکال‌زدایی و تحلیل رویدادها است و هیچ برنامه‌ای نباید به ساختار یا فرمت خاصی از این رویدادها وابسته باشد.

توجه داشته باشید که اگرچه libinput و libinput-record رویدادهای یکسانی را از گره‌های دستگاه مشاهده می‌کنند، اما هیچ تضمینی برای ترتیب دقیق رویدادها وجود ندارد. رویدادهای libinput ممکن است زودتر یا دیرتر از رویدادهای گره‌های دستگاه دریافت شوند و برای برخی دستگاه‌ها، libinput ممکن است پیش از پردازش، جریان رویدادها را به صورت داخلی تغییر دهد.

همچنین کانتکست libinput ایجادشده توسط libinput-record تأثیری روی نشست میزکار در حال اجرا ندارد و نمی‌تواند گزینه‌های پیکربندی آن نشست را کپی کند.

هنگامی که گزینه خط فرمان --with-hidraw داده شود، libinput-record به دنبال گره یا گره‌های hidraw دستگاه‌های مشخص‌شده می‌گردد و هرگونه گزارش HID دریافتی از آن دستگاه‌ها را چاپ می‌کند.

گزارش‌های HID مبهم‌سازی نمی‌شوند و یک فرد با انگیزه کافی می‌تواند کلیدهای فشرده‌شده را از لاگ‌ها بازیابی کند. هنگام ضبط گزارش‌های HID از تایپ رمزهای عبور خودداری نمایید.

فرمت فایل خروجی به زبان YAML است و به گونه‌ای طراحی شده که هم برای انسان خوانا بوده و هم توسط ماشین قابل تجزیه (Parse) باشد. در زیر یک نمونه خلاصه از فایل YAML آمده است و تمام کلیدها در بخش‌های بعدی با جزئیات توضیح داده شده‌اند.

هر تجزیه‌کننده‌ای (Parser) باید کلیدهایی را که در توضیحات قالب فایل نیامده است نادیده بگیرد. فیلد شماره نسخه فقط برای تغییرات ناسازگار با نسخه‌های قبلی استفاده می‌شود.

version: 1
ndevices: 2
libinput:
  version: 1.10.0
system:
  os: "fedora:26"
  kernel: "4.13.9-200.fc26.x86_64"
  dmi: "dmi:bvnLENOVO:bvrGJET72WW(2.22):bd02/21/2014:svnLENOVO:..."
devices:
  - node: /dev/input/event9
    evdev:
      # Name: Synaptics TM2668-002
      # ID: bus 0x1d vendor 0x6cb product 00 version 00
      # Size in mm: 97x68
      # Supported Events:
      # Event type 0 (EV_SYN)
      #.. abbreviated for man page ...
      #
      name: Synaptics TM2668-002
      id: [29, 1739, 0, 0]
      codes:
        0: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] # EV_SYN
        1: [272, 325, 328, 330, 333, 334, 335] # EV_KEY
        3: [0, 1, 24, 47, 48, 49, 52, 53, 54, 55, 57, 58] # EV_ABS
      absinfo:
        0: [0, 4089, 0, 0, 42]
        1: [0, 2811, 0, 0, 41]
        24: [0, 255, 0, 0, 0]
        47: [0, 4, 0, 0, 0]
        48: [0, 15, 0, 0, 0]
        49: [0, 15, 0, 0, 0]
        52: [0, 1, 0, 0, 0]
        53: [0, 4089, 0, 0, 42]
        54: [0, 2811, 0, 0, 41]
        55: [0, 2, 0, 0, 0]
        57: [0, 65535, 0, 0, 0]
        58: [0, 255, 0, 0, 0]
      properties: [0, 2, 4]
    hid: [12, 23, 34, 45, ...]
    udev:
      properties:
      - ID_INPUT_MOUSE=1
      - ID_INPUT=1
    quirks:
      - ModelAppleTouchpad=1
      - AttrSizeHint=32x32
    events:
      - hid:
         time: [ 0, 0]
         hidraw0: [1, 2, 3, 4]
      - evdev:
        - [  0,      0,   3,  57,  1420] # EV_ABS / ABS_MT_TRACKING_ID   1420
        - [  0,      0,   3,  53,  1218] # EV_ABS / ABS_MT_POSITION_X    1218
        - [  0,      0,   3,  54,  1922] # EV_ABS / ABS_MT_POSITION_Y    1922
        - [  0,      0,   3,  52,     0] # EV_ABS / ABS_MT_ORIENTATION      0
        - [  0,      0,   3,  58,    47] # EV_ABS / ABS_MT_PRESSURE        47
        - [  0,      0,   1, 330,     1] # EV_KEY / BTN_TOUCH               1
        - [  0,      0,   1, 325,     1] # EV_KEY / BTN_TOOL_FINGER         1
        - [  0,      0,   3,   0,  1218] # EV_ABS / ABS_X                1218
        - [  0,      0,   3,   1,  1922] # EV_ABS / ABS_Y                1922
        - [  0,      0,   3,  24,    47] # EV_ABS / ABS_PRESSURE           47
        - [  0,      0,   0,   0,     0] # ------------ SYN_REPORT (0) ------- +0ms
      - evdev:
        - [  0,  11879,   3,  53,  1330] # EV_ABS / ABS_MT_POSITION_X    1330
        - [  0,  11879,   3,  54,  1928] # EV_ABS / ABS_MT_POSITION_Y    1928
        - [  0,  11879,   3,  58,    46] # EV_ABS / ABS_MT_PRESSURE        46
        - [  0,  11879,   3,   0,  1330] # EV_ABS / ABS_X                1330
        - [  0,  11879,   3,   1,  1928] # EV_ABS / ABS_Y                1928
        - [  0,  11879,   3,  24,    46] # EV_ABS / ABS_PRESSURE           46
        - [  0,  11879,   0,   0,     0] # ------------ SYN_REPORT (0) ------- +0ms
  # second device (if any)
  - node: /dev/input/event9
    evdev: ...
کلیدهای سطح بالا (Top-level) در زیر آورده شده‌اند؛ برای جزئیات هر کلید، زیربخش مربوطه را ببینید.
نسخه قالب فایل. این نسخه تنها برای تغییرات ناسازگار با گذشته افزایش می‌یابد. یک تجزیه‌کننده برای سازگاری با نسخه‌های آینده باید کلیدهای ناشناخته را نادیده بگیرد.
تعداد دستگاه‌های ضبط‌شده در این فایل. همیشه برابر با ۱ است مگر اینکه با گزینه --all یا چندین دستگاه ضبط شده باشد.
دیکشنری حاوی اطلاعات اختصاصی libinput.
دیکشنری حاوی اطلاعات سیستم.
فهرستی از دستگاه‌ها شامل مشخصات و رویدادهای هر دستگاه.

نسخه libinput

اطلاعات مربوط به سیستم

شناسه و نسخه توزیع، os-release(5) را ببینید.
نسخه کرنل، uname(1) را ببینید.
مقدار DMI modalias، فایل /sys/class/dmi/id/modalias را ببینید.

اطلاعات و رویدادهای گره‌های دستگاه ضبط‌شده

گره دستگاه ضبط‌شده
دیکشنری حاوی اطلاعات دستگاه evdev.
فهرستی از اعداد صحیح نشان‌دهنده بایت‌های توصیف‌گر گزارش HID.
دیکشنری حاوی اطلاعات دستگاه udev.
فهرستی از دیکشنری‌های حاوی رویدادهای ضبط‌شده.

نام دستگاه
داده‌های برگرفته از struct input_id، شامل نوع گذرگاه، شناسه سازنده، محصول و نسخه.
تمامی انواع و کدهای evdev به صورت دیکشنری تو در تو. نوع evdev به عنوان کلید و کدها به عنوان لیست مشخص می‌شوند.
آرایه‌ای از آرایه‌ها با ۶ عنصر ده‌دهی در هر کدام، که محتوای struct input_absinfo را نشان می‌دهد. اولین عنصر کد (مثلاً ABS_X) در قالب ده‌دهی است.
آرایه‌ای شامل تمامی ثابت‌های INPUT_PROP_FOO. می‌تواند یک آرایه خالی باشد.

فهرستی از ویژگی‌های udev در قالب key=value. این لیست شامل تمام ویژگی‌های انتساب داده‌شده به دستگاه نیست، بلکه زیرمجموعه‌ای است که برای libinput اهمیت دارد. این ویژگی‌ها ممکن است شامل مشخصه‌های تنظیم‌شده روی دستگاه والد نیز باشند.
فهرستی از رفتارهای خاص (Quirks) دستگاه در قالب key=value.

فهرستی از رویدادهای ضبط‌شده. محتوای این بخش لیستی از دیکشنری‌ها است که رشته موجود در آن‌ها نوع توالی رویداد را مشخص می‌کند.

{ evdev: [ [sec, usec, type, code, value], ...] }
هر دیکشنری evdev شامل محتوای یک struct input_event در قالب ده‌دهی است. آخرین مورد در لیست همیشه SYN_REPORT مربوط به این فریم رویداد است. فریم رویداد بعدی یک مدخل جدید دیکشنری evdev را در لیست والد events آغاز می‌کند.
{ hid: hidrawX : [ 12, 34, 56 ], ...] }
دیکشنری hid شامل گزارش‌های hid در قالب ده‌دهی است که گره hidraw به عنوان کلید آن عمل می‌کند. کلید ویژه time نشان‌دهنده زمان فعلی هنگام خواندن گزارش از هسته است.

توجه داشته باشید که هسته لینوکس برچسب زمانی (timestamp) برای رویدادهای hidraw ارائه نمی‌دهد و زمان‌های ارائه‌شده از clock_gettime(3) دریافت می‌شوند؛ بنابراین ممکن است از برچسب زمانی رویداد بعدی evdev بزرگ‌تر باشند.

این ابزار رویدادها را مستقیماً از هسته ضبط می‌کند و مستقل از libinput است. به بیان دیگر، به‌روزرسانی یا تغییر libinput خروجی این ابزار را تغییر نخواهد داد. همچنین برای ضبط رویدادها نیازی نیست که libinput لزوماً در حال استفاده باشد.

بخشی از مجموعه libinput(1)