Wie man einen Mitbewohner spielt

Vom Übersetzer


Der Student der Tufts University erzählt, wie man seinen Mitbewohner neckt. Er hat mich sogar gepinnt, als er seine Geschichte mit der Tatsache begann, dass sie einen 4K-Fernseher im Hostel haben.

Einführung


Bevor ich darüber spreche, wie ich den unglücklichen Logan gebracht habe, muss ich das Mediensystem in unserem Zimmer erklären. Bald wirst du verstehen warum.

Logan, wenn du das liest, hoffe ich, dass du mehr Spaß hattest als nicht.

Disposition


Wir haben einen Computer mit einem Desktop-Ubunt, der an ein Fernsehgerät angeschlossen ist. Er fungiert als Medienserver. Da er immer noch eine permanente Internetverbindung benötigt, drehen sich dort immer noch ein Webserver mit einigen Seiten, ein SSH-Server und eine Reihe anderer Dienste.

Aufgrund der Tatsache, dass der Fernseher 4K ist und der Computer aus dem, was zur Hand war, zusammengebaut ist, zieht seine Grafikkarte nicht. Logan entschied sich für den Kauf des alten NVIDIA-Vidyuha, der vor einigen Generationen veröffentlicht wurde (was immer noch viel besser ist als das, was er war), um 4K-Videos normal abzuspielen.

Die Geburt einer Idee


Kurz nach der Installation haben wir ein paar Probleme mit den Treibern. In diesem Moment dachte ich, es würde Spaß machen, Fehlermeldungen manuell anzeigen zu können.

Nach einigen Recherchen im Internet wurde klar, dass das Remote-Aufrufen einer Nachricht auf einem Fernseher so einfach ist wie:

  1. Melden Sie sich über SSH beim Computer als Benutzer an, der die Übertragung ausführt
  2. DISPLAY=:0 zenity --info --text '!'

DISPLAY=:0 erforderlich, da in meiner Sitzung keine Anzeige erfolgt, ich die Meldung jedoch auf dem Hauptbildschirm anzeigen möchte.

Da wir Probleme mit NVIDIA vidyuha hatten, beschloss ich, über Folgendes nachzudenken:

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

Es hat funktioniert, aber jedes Mal, wenn Sie sich mit dem SSH-Client beim Server anmelden, um Logan herunterzufahren, ist dies ein Vergnügen. Also habe ich beschlossen zu betrügen. Ich dachte über die Aufgabe in der Krone nach, ihn nach einem Zeitplan zu verärgern, aber es gab ein paar Probleme:

  1. Eigentlich Regelmäßigkeit
  2. Wir hatten andere Aufgaben in der Krone, was das Risiko erhöhte, meine heimtückische Aufgabe preiszugeben

Andere Optionen wie das SysVInit-Skript wurden aus den gleichen Gründen gelöscht. Aus diesem Grund habe ich beschlossen, eine öffentliche Webseite mit der Schaltfläche „Haben Sie einen Logan“ zu erstellen.

Vorbereitung zeichnen


Ich dachte mir, dass ich zunächst ein paar Dinge brauchen würde:

  1. Etwas, das Benutzereingaben verarbeitet
  2. Etwas, das als Webbenutzer beliebige Befehle ausführt

Also kam ich zu:

  1. Nginx
  2. FPM-Erweiterung für NGINX
  3. Php
  4. FPM-Paket für PHP

Als Ergebnis habe ich eine Site mit der Zielseite logan.html und der Aktionsseite 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 Tags enthalten einen kleinen Unsinn, um die Seite für Mobiltelefone anzupassen (denken Sie daran, dass ich die Verwendung unterwegs einfach mache?). Für diejenigen, die nicht wissen, wie man HTML in meinem Kopf rendert, zeige ich Ihnen, wie es aussieht:



Wenn die Taste gedrückt wird, wechselt die POST-Anforderung zu einer anderen Seite, die die gesamte Drecksarbeit erledigt:

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' /> 

Diese Seite macht eine Reihe von Dingen:

  1. Wählt eine zufällige Fehlermeldung aus
  2. Wählt den Typ des Dialogfelds aus.
  3. Demonstriert eine Nachricht für einen bestimmten Zeitraum (10 Sekunden)
  4. Er zieht einen Knopf und erklärt, was passiert - alles begleitet von Logans lustigem Bild persönlich

Für diejenigen, die HTML immer noch nicht in ihren Köpfen rendern können (hoffentlich wieder die meisten Leute), sieht die Seite folgendermaßen aus:



Wenn Sie sich fragen, warum die Webseite Code auf diese Weise ausführen darf und warum der Eigentümer der Webserversitzung ( www-data ) Befehle als Anzeigebenutzer (der thedisplayuser ) ausführen kann, sind Sie möglicherweise froh zu wissen, dass ich dies stark eingeschränkt habe sudoers Datei:

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

Dieser spezielle Teil der Konfiguration ermöglicht es www-data, nur / usr / bin / zenity als Displaybenutzer ohne Passwort auszuführen. Ich habe dies getan, nachdem ich dumme Fehler in den PHP- und NGINX-Einstellungen durcheinander gebracht hatte. Dann habe ich die URL an ein paar Freunde auf dem Campus gesendet, die Logan kennen.

Ergebnis zeichnen


Lob den Himmel, Logan reagierte so heftig wie er konnte. Wenn er leicht genervt gewesen wäre, hätte mich der Gedanke, dass meine Bemühungen verschwendet worden wären, geärgert. Aber nein! Er verlor die Beherrschung. Ich kann nicht zählen, wie viele Neustarts, Neuinstallationen von Treibern und Kernel-Änderungen es gab. Ich bedauere nur, dass ich kein Video darüber gedreht habe, wie er nach dem Start von VLC wütend wurde, als jemand ein paar Fenster mit Nachrichten über Grafikkartenfehler herausgeschmissen hat.

Aber ich wurde zu mitgerissen und Chris, unser anderer Mitbewohner, beschloss einzugreifen ...

Jägerjagd


Erste Stufe


Eines schönen Tages, als Logan schlief, bemerkte ich eine Fehlermeldung: "Max steckt dahinter." Choooo? Ich habe eine Streichbox! Also begann ich zu verstehen und fand heraus, dass jemand (Chris) diesen Satz in eine Reihe von zufälligen Nachrichten in zenity.php . Ich löschte es schnell (bis Logan hörte, dass sie es spielten) und entschied, dass der Spaß vorbei war. Da war es.

Zweite Stufe


Nach ungefähr einer Woche tauchte die Nachricht wieder auf. Ich dachte, Chris hätte mich verbrannt und wieder in die Liste aufgenommen. Keine verdammte Sache. Er war nicht da. Nach einer sorgfältigen Untersuchung der Datei stellte ich fest, dass sie jetzt /usr/sbin/zenity anstelle von /usr/bin/zenity (die Systemvorgabe) heißt und sudoers einen entsprechenden zulässigen Eintrag hatte. Was ist /usr/sbin/zenity ? Shell-Skript:

 #!/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 

Nun, das war die nächste Stufe des Mistes, wenn ich jemals so etwas getroffen habe. In 99% der Fälle funktionierte alles so, wie es sollte, und in den restlichen ein Prozent tauchte die Meldung „Max steht hinter“ auf. Ich habe die Datei gelöscht (ich weiß, es hat sich nicht gelohnt) und durch das Schreiben an sudoers zenity.php in die ursprüngliche Form gebracht. Nachrichten werden nicht mehr angezeigt. Aber dann kamen sie zurück.

Dritte Stufe


Ich habe zenity.php überprüft. Nichts Neues. /usr/sbin/zenity ? Verschwunden. Ich bin entmutigt. Dann habe ich beschlossen, in /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 

Kleiner schlauer Bastard. Er hat die Zenity-Binärdatei repariert und daraus ein Bash-Skript gemacht, das einmal und 70 funktioniert. Was zur Hölle? Und es ist alles für rpmdb-client ? Also habe ich mich gewehrt, indem ich es geändert habe:

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

Hast du den Unterschied bemerkt? Andernfalls wird /usr/sbin/rpmdb-client anstelle von /usr/bin/rpmdb-client , wodurch ein Bash-Skript /usr/bin/rpmdb-client , das nichts tut. Mit genügend Glück wird er keinen zusätzlichen Charakter bemerken und seine Nachricht wird niemals erscheinen.

TODO: Verstehe den Unterschied zwischen den ausführbaren ELF-Dateien /usr/sbin/zenity und dem von Chris erstellten /usr/bin/rpmdb-client . Es gibt einen merkwürdigen Unterschied in den Binärdateien, den ich noch nicht verstanden habe.

Vierte Stufe


Ich beschloss, die Verteidigung zu stärken, bis Chris den Unterschied in einem oben beschriebenen Brief bemerkte. Ich habe alle meine Änderungen abgebrochen und beschlossen, stattdessen zenity zu patchen. Ein tiefer Dank geht an Tom Hebb (wie in jedem meiner technischen Beiträge), der mir dabei geholfen hat. Folgendes habe ich getan:

  1. Konfiguriert apt zum Herunterladen der Quellen (in diesem Fall Hinzufügen von deb-src zu /etc/apt/sources.list )
  2. apt-get source zenity
  3. Einen Patch mit quilt :
    1. quilt new myPatch.diff
    2. Ein Patch für src/msg.c , der das Vorhandensein des Wortes "Max" im Nachrichtentext bestimmt:

      msg.c
       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. Ich erkannte, dass das Erstellen und Installieren eines neuen Pakets blasser ist als das Ersetzen einer Binärdatei
  7. Ersetzte leise die rpmdb-client (seine zenity ) durch meine Version
  8. Klopfte ihm auf den Rücken

Dieser Patch ändert das Verhalten von zenity so, dass die Anwendung stillschweigend nichts unternimmt, sobald das Wort „Max“ im Nachrichtentext erscheint.

Fazit


Bis Ende März hat Chris nie herausgefunden, dass ich die Binärdatei korrigiert habe. Infolgedessen sah Logan keine einzige Nachricht mit meinem Namen. Also beschloss ich, die Rallye fortzusetzen, bis ich ihm nach dem Ende des Kurses alles erzählte. Aber als der Unterricht vorbei war, trennten wir uns. Obwohl Logan und ich nächstes Jahr wieder zusammenleben werden, werden wir höchstwahrscheinlich nicht so viel Zeit im Raum verbringen, damit die Rallye Sinn macht. Deshalb habe ich beschlossen, diesen Beitrag zu veröffentlichen, bevor ich mit neuen Tricks beginne.

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


All Articles