كيف تلعب زميل الغرفة

من المترجم


يروي طالب في جامعة تافتس كيفية مضايقة زميله في الغرفة. حتى أنه ثبتني عندما بدأ قصته بحقيقة أن لديهم تلفزيون 4K في النزل.

مقدمة


قبل أن أتحدث عن كيفية إحضار لوجان المؤسف ، يجب أن أشرح نظام الوسائط في غرفتنا. قريبا سوف تفهم لماذا.

لوغان ، إذا قرأت هذا ، آمل أن تكون قد استمتعت أكثر من عدمه.

التصرف


لدينا جهاز كمبيوتر مع Ubunt سطح مكتب متصل بجهاز تلفزيون. يعمل كخادم وسائط. نظرًا لأنه لا يزال بحاجة إلى اتصال دائم بالإنترنت ، لا يزال هناك خادم ويب يحتوي على صفحتين ، وخادم SSH وعدد من الخدمات الأخرى تدور هناك.

نظرًا لحقيقة أن التلفاز هو 4K ، ويتم تجميع الكمبيوتر مما كان في متناول اليد ، لا يتم سحب بطاقة الفيديو الخاصة به. قرر لوجان شراء NVIDIA vidyuha القديم ، الذي تم إصداره قبل عدة أجيال (والذي لا يزال أفضل بكثير مما كان عليه) من أجل تشغيل فيديو 4K بشكل طبيعي.

ولادة فكرة


بعد وقت قصير من التثبيت ، خرجنا من بعض الأخطاء مع السائقين. في تلك اللحظة ، اعتقدت أنه سيكون من الممتع أن تكون قادرًا على عرض رسائل الخطأ يدويًا.

بعد إجراء بعض عمليات البحث على الإنترنت ، أصبح من الواضح أن استدعاء رسالة عن بعد على التلفزيون أمر بسيط مثل:

  1. قم بتسجيل الدخول عبر SSH إلى الكمبيوتر كمستخدم يقوم بتشغيل البث
  2. DISPLAY=:0 zenity --info --text '!'

DISPLAY=:0 ضروري ، لأنه في جلستي لا يوجد عرض ، لكنني أريد إظهار الرسالة على الشاشة الرئيسية.

نظرًا لأن لدينا مشاكل مع NVIDIA vidyuha ، فقد قررت الخوض في شيء مثل:

 DISPLAY=:0 zenity --warning --text '     .' 

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

  1. في الواقع ، الانتظام
  2. كانت لدينا مهام أخرى في التاج ، مما زاد من خطر الكشف عن مهمتي الخبيثة

تم إسقاط خيارات أخرى مثل البرنامج النصي SysVInit لنفس الأسباب. لذلك ، قررت إنشاء صفحة ويب عامة باستخدام الزر "Have a Logan".

إعداد الرسم


اكتشفت أنني سأحتاج إلى شيئين لبدء:

  1. شيء يتعامل مع إدخال المستخدم
  2. شيء تنفيذ أوامر عشوائية كمستخدم ويب

لذلك جئت إلى:

  1. Nginx
  2. ملحق FPM لـ NGINX
  3. فب
  4. حزمة FPM لـ PHP

ونتيجة لذلك، ولقد تقدمت موقع على شبكة الانترنت مع هبوط logan.html و "العمل ل» zenity.php :

logan.html
 <!-- logan.html --> <html> <head> <style type="text/css"> form button { font-size: 20px; } div.explanation { width: 400px; } </style> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="HandheldFriendly" content="true"> </head> <body> <form method="POST" action="/zenity.php"> <button> </button> </form> </body> </html> 

هناك القليل من الهراء في العلامات meta لتكييف الصفحة للهواتف المحمولة (تذكر أنني أجعلها سهلة الاستخدام أثناء التنقل؟) بالنسبة لأولئك الذين لا يعرفون كيفية عرض HTML في رأسي ، أريكم كيف يبدو:



عند الضغط على الزر ، ينتقل طلب POST إلى صفحة أخرى ، والتي تؤدي جميع الأعمال القذرة:

zenity.php
 <?php /* zenity.php */ $messages = Array( " .", " .", " .", " .", " .", " .", "       .", "   .", "   .", "   .", "    and has recovered.", "     .", "     .", "     .", "     .", "     .", "     .", " NVIDIA  .", "NVIDIA    - . ( 43)", "    wlx10bef54d395c." ); $statuses = Array("error", "warning"); $msg = $messages[array_rand($messages)]; $status = $statuses[array_rand($statuses)]; $timeout = "--timeout 10"; exec("sudo -u thedisplayuser /usr/sbin/zenity --$status --display=:0 --text ': $msg' $timeout > /dev/null &"); include 'logan.html'; ?> <div class="explanation">                ,       .   ,        // .. </div> <br /> <img src='/logan.jpg' /> 

تقوم هذه الصفحة بعدد من الأشياء:

  1. يحدد رسالة خطأ عشوائية
  2. يحدد نوع مربع الحوار.
  3. يوضح رسالة لفترة زمنية محددة (10 ثوان)
  4. يرسم زرًا ويشرح ما يحدث - كل ذلك مصحوبًا بصورة لوجان المضحكة شخصيًا

بالنسبة لأولئك الذين ما زالوا لا يستطيعون عرض HTML في رؤوسهم (مرة أخرى ، على أمل أن معظم الناس) ، تبدو الصفحة كما يلي:



إذا كنت تتساءل عن سبب السماح لصفحة الويب بتنفيذ التعليمات البرمجية بهذه الطريقة ، ولماذا يمكن لمالك جلسة خادم الويب ( www-data ) تنفيذ الأوامر بصفته مستخدم العرض ( thedisplayuser ) ، فقد thedisplayuser معرفة أنني قمت thedisplayuser هذا بشدة ملف sudoers :

 # /etc/sudoers www-data ALL=(thedisplayuser) NOPASSWD: /usr/bin/zenity 

يسمح هذا الجزء المحدد من التهيئة بتشغيل بيانات www فقط / usr / bin / zenity كمستخدم عرض بدون كلمة مرور. فعلت ذلك بعد العبث بأخطاء غبية في إعدادات PHP و NGINX. ثم أرسلت URL إلى اثنين من الأصدقاء في الحرم الجامعي الذين يعرفون لوغان.

ارسم النتيجة


الحمد لله ، رد فعل لوغان بعنف قدر استطاعته. لو كان منزعجًا قليلاً ، لكانت الفكرة التي أهدرت جهودي قد أزعجتني. لكن لا! فقد أعصابه. لا يمكنني حساب عدد عمليات إعادة التشغيل وعمليات إعادة تثبيت برنامج التشغيل وتعديلات kernel الموجودة. يؤسفني فقط أنني لم أصوّر مقطع فيديو حول كيفية غضبه بعد بدء تشغيل VLC ، عندما ألقى شخص ما مجموعة من النوافذ برسائل حول أخطاء بطاقة الفيديو.

لكنني ابتعدت كثيرًا ، وقرر كريس ، زميلنا الآخر في الغرفة ، التدخل ...

مطاردة الصياد


المرحلة الأولى


في أحد الأيام الجميلة ، عندما كان لوغان نائمًا ، لاحظت رسالة خطأ نصها: "ماكس وراء كل هذا." Choooo؟ لقد حصلت على prankbox! لذلك ، بدأت أفهم واكتشفت أن شخصًا (كريس) قدم هذه العبارة في مجموعة من الرسائل العشوائية في zenity.php . لقد حذفتها بسرعة (حتى سمع لوجان أنهم كانوا يلعبونها) وقررت أن المرح قد انتهى. كان هناك.

المرحلة الثانية


بعد أسبوع أو نحو ذلك ، ظهرت الرسالة مرة أخرى. اعتقدت أن كريس أحرقني وأعاد إضافته إلى القائمة. ليس بالشيء اللعين لم يكن هناك. بعد دراسة متأنية للملف، لاحظت أن يطلق عليه الآن /usr/sbin/zenity بدلا من /usr/bin/zenity (نظام افتراضيا)، و sudoers تم تسجيل القرار المناسب. إذن ما هو /usr/sbin/zenity ؟ نص شل:

 #!/bin/bash echo '.' >> /tmp/log.txt if [ 0 -eq $((RANDOM % 100)) ]; then /usr/bin/zenity --error --display=:0 --text "   ." --timeout 10 > /dev/null & else /usr/bin/zenity "$@" fi 

حسنًا ، كان هذا هو المستوى التالي من الهراء ، إذا قابلت أي شيء من هذا القبيل. 99٪ من الوقت الذي عمل فيه كل شيء كما ينبغي ، وفي النسبة المتبقية ، ظهرت رسالة "ماكس يقف وراء". لقد حذفت الملف (أعلم أنه لا يستحق ذلك) والكتابة إلى sudoers zenity.php إلى شكله الأصلي. توقفت الرسائل عن الظهور. ولكن بعد ذلك عادوا.

المرحلة الثالثة


راجعت zenity.php . لا جديد. /usr/sbin/zenity ؟ اختفى. أنا محبط. ثم قررت أن ننظر داخل /usr/bin/zenity :

 #!/bin/bash # ---    --- # ---    --- # ---    --- # ---    --- # ---    --- if [ 0 -eq $((RANDOM % 70)) ]; then /usr/bin/rpmdb-client --error --display=:0 --text """"" """""" """""""""""" """"""""." --timeout 10 > /dev/null & else /usr/bin/rpmdb-client "$@" fi 

نذل ماكر قليلا. قام بإصلاح ثنائي السمت ، جاعلاً منه نص باش يعمل مرة واحدة و 70. ماذا بحق الجحيم؟ rpmdb-client نوع من rpmdb-client ؟ لذا ، قاتلت بتغييره:

 # <> if [ 0 -eq $((RANDOM % 70)) ]; then /usr/sbin/rpmdb-client --error --display=:0 --text """"" """""" """""""""""" """"""""." --timeout 10 > /dev/null & else /usr/bin/rpmdb-client "$@" fi 

هل لاحظت الفرق؟ خلاف ذلك ، يتم استدعاء /usr/sbin/rpmdb-client بدلاً من /usr/bin/rpmdb-client ، الذي يقوم بتشغيل نص bash النصي الذي لا يفعل شيئًا. مع ما يكفي من الحظ ، لن يلاحظ شخصية إضافية ولن تظهر رسالته أبدًا.

TODO: فهم الفرق بين ملفات ELF التنفيذية /usr/sbin/zenity /usr/bin/rpmdb-client الذي أنشأه Chris. هناك اختلاف غريب في الثنائيات لم أفهمه بعد.

المرحلة الرابعة


قررت تعزيز الدفاع ، حتى لاحظ كريس الفرق في حرف واحد موصوف أعلاه. لقد ألغيت جميع التغييرات وقررت تصحيح zenity بدلاً من ذلك. امتنان عميق لتوم هيب (كما هو الحال في كل وظيفة فنية) لمساعدتي في ذلك. هذا ما فعلته:

  1. تم apt لتنزيل المصادر (في هذه الحالة ، إضافة deb-src إلى /etc/apt/sources.list )
  2. apt-get source zenity
  3. جعل التصحيح quilt :
    1. quilt new myPatch.diff
    2. تصحيح لـ src/msg.c يحدد وجود كلمة "Max" في نص الرسالة:

      رسالة
       Index: zenity-3.18.1.1/src/msg.c =================================================================== --- zenity-3.18.1.1.orig/src/msg.c +++ zenity-3.18.1.1/src/msg.c @@ -21,6 +21,8 @@ * Authors: Glynn Foster <glynn.foster@sun.com> */ +#include <string.h> + #include "config.h" #include "zenity.h" @@ -85,6 +87,11 @@ zenity_msg (ZenityData *data, ZenityMsgD GObject *text; GObject *image; + if (strstr(msg_data->dialog_text, "Max") + || strstr(msg_data->dialog_text, "max")) { + return; + } + switch (msg_data->mode) { case ZENITY_MSG_WARNING: builder = zenity_util_load_ui_file ("zenity_warning_dialog", NULL); 
    3. quilt add src/msg.c
    4. quilt pop
  4. dpkg-source --commit
  5. dpkg-buildpackage -us -uc
  6. أدركت أن إنشاء حزمة جديدة وتثبيتها أكثر شاحبًا من استبدال ثنائي
  7. بهدوء استبدال rpmdb-client ( rpmdb-client ) ثنائي مع الإصدار الخاص بي
  8. ربت ظهره

يغير هذا التصحيح سلوك zenity بطريقة تجعل كلمة "ماكس" بمجرد ظهور كلمة "ماكس" في نص الرسالة ، لا تفعل شيئًا بصمت.

الخلاصة


حتى نهاية مارس ، لم يكتشف كريس مطلقًا أنني قمت بتصحيح ثنائي. ونتيجة لذلك ، لم ير لوغان رسالة واحدة باسمي. لذلك قررت مواصلة المسيرة حتى أخبرته بكل شيء بعد نهاية الدورة. ولكن عندما انتهت الدروس ، افترقنا. على الرغم من أننا سنعيش معًا مرة أخرى مع لوجان العام المقبل ، إلا أننا على الأرجح لن نقضي الكثير من الوقت في الغرفة حتى يكون التجمع منطقيًا. لذلك قررت نشر هذا المنشور قبل بدء الحيل الجديدة.

Source: https://habr.com/ru/post/ar417915/


All Articles