Named Pipe für die Kommunikation zwischen Prozessen

382
highsciguy

Ich möchte eine Named Pipe für die Kommunikation zwischen einem PHP-Serverskript und einem Dienst verwenden, dh einen Prozess (ein Python-Skript), der am anderen Ende der Pipe lauscht. Dieser Dienst wird absichtlich unter einem nicht privilegierten Benutzer ausgeführt und erstellt auch die Pipe mit einem Python-Befehl, der dem entspricht mkfifo mypipe. Dies ergibt eine Pseudo-Datei, die sich mypipeim Besitz dieses nicht privilegierten Benutzers befindet.

Da das PHP-Skript als anderer Benutzer ausgeführt wird, kann es nicht sofort in diese Pipe schreiben. Natürlich gibt es verschiedene Wege, um das Problem zu lösen. Ich möchte jedoch mögliche Fallstricke vermeiden.

Meine Frage ist also, in welches Verzeichnis ich die Named Pipe stellen sollte (Serververzeichnis ist / var / www), welcher Eigentümer und welche Berechtigungen es haben soll, und schließlich, wie und wo ich den von PHP gesendeten Inhalt validieren sollte -script zum Dienst.

0

1 Antwort auf die Frage

1
Eugen Rieck

Hier gibt es viele Fragen, von denen einige keine kanonische Antwort haben. Lesen Sie dies bitte als meine 0,02 $ und nicht als "grundlegende Wahrheit".

  • Eingabeüberprüfung: Ich halte es für fleißig, die Eingabe so früh wie möglich zu überprüfen. In Ihrem Fall wäre dies einmal unmittelbar nach dem Start des PHP-Skripts, das zweite Mal unmittelbar nachdem das Python-Skript die Anforderung über das FIFO erhalten hat, und das dritte Mal nachdem das PHP-Skript die Antwort vom FIFO erhalten hat.
  • Interface-Datenformat (Escapeing): Sie könnten (und IMHO sollte) versuchen, eine in der Praxis erprobte Bibliothek zu verwenden, um dies zu erreichen: JSON kommt in den Sinn, da sowohl PHP als auch Python über gute Codierungs- / Decodierungsbibliotheken verfügen. In diesem Fall würde ich die Daten unmittelbar vor dem Schreiben in den FIFO codieren und sofort danach decodieren. In der Tat sollten Sie ein "send_to_interface" / "receive_from_interface" -Methodenpaar auf jeder Seite in Betracht ziehen, das die Kodierung / das Schreiben bzw. das Schreiben kombiniert. Lesen / Dekodieren in ein Atom. Wenn Sie einen anderen Schnittstellenmechanismus verwenden möchten, müssen Sie einfach ein neues Paar erstellen, ohne den Rest des Codes berühren zu müssen.
  • FIFO-Besitz und -Privilegien: Ich möchte eine Gruppe erstellen, die nur aus dem Servicebenutzer und dem WWW-Benutzer besteht, und dann einen chgrp servicegroup && chmod 660FIFO-Vorgang durchführen. Möglicherweise möchten Sie auch mit einem Socket anstelle eines FIFOs recherchieren. Dies erleichtert die Privilegiensituation und bereitet Sie auf eine Situation vor, in der der Dienst und der Webserver nicht auf demselben Computer ausgeführt werden. Je nachdem, was Ihr Python-Dienst tut, lohnt es sich möglicherweise, ihn in einer Web-Schicht auszuführen und cURL auf der PHP-Seite zu verwenden, um darauf zuzugreifen. Die Einkapselung, die zuvor in dem Aufzählungspunkt vorgeschlagen wurde, erleichtert das Wechseln zwischen diesen verschiedenen Mechanismen.
Danke für die Einsichten. Da ich bereits JSON für die Übertragung verwende, könnte ich, wenn Sie wissen, Hilfe beim Codieren mit Hilfe von Codierungs- / Decodierungsbibliotheken an beiden Enden verwenden (oder kann ich die Standardbibliotheken als sicher betrachten). Im Hinblick auf die `chgrp servicegroup` macht es mir ein bisschen schwer, dass ich wahrscheinlich entweder einen Eintrag zur sudoers-Datei für den Dienstbenutzer hinzufügen muss, um die Berechtigung zum Ändern der Gruppe zu erhalten oder ein Initialisierungsskript zu erstellen, um das Programm auszuführen Befehl mit Privilegien. highsciguy vor 5 Jahren 0