Warum ist mein TCP-Verbindungsversuch über PHP komisch?

559
confetti

Ich bin nicht sicher, ob dies hier oder auf SO besser ist, aber da das Problem nicht in der Programmierung liegt, habe ich mir gedacht, dass es hier zutrifft (oder auf U & L oder auf Serverfault, aber ich denke / hoffe, dass es mir gut geht.)

Ich möchte TCP-Befehle von PHP an eine Instanz von Telegramm-cli senden .

Bis jetzt habe ich verwendet: shell_exec('echo "msg user#idXXXXXX message" | nc 127.0.0.1 9007');und es hat gut funktioniert. Aber es gibt Variablen und Benutzereingaben, und obwohl ich meine Variablen zitiere, finde ich das schlechtes OPSEC. Ich möchte stattdessen PHP- Sockets verwenden, aber hier beginnen die Probleme.

Der TCP-Server wird unter dem Benutzer "B" auf dem Server gestartet. PHP läuft als "www-data". Das Ausführen des oben genannten shell_execfunktioniert als Benutzer gut www-data. Als Benutzer angemeldet zu sein Aund den Befehl direkt in einer Bash-Shell auszuführen, funktioniert auch. Mit dem nackten netcat kann ich mich auch als Benutzer mit dem Socket verbinden, Adeshalb denke ich, dass ein Berechtigungsproblem hier nicht der Fall ist. Benutzer Aist ein normaler Benutzer ohne besondere Berechtigungen.

Mein PHP-Code:

$fp = fsockopen("127.0.0.1", 9007, $errno, $errstr, 5); fwrite($fp, 'msg user#idXXXX "message"'); 

Was das macht, ist absolut nichts.
Und hier kommt der Grund, warum ich dies für StackOverflow nicht für angebracht halte:

Wenn ich nach dem Ausführen als Benutzer versuche, eine Verbindung zum Port 9001(zum Testen) anstelle von 9007(auf dem tg-cli ausgeführt wird) zu verbinden, funktioniert es einwandfrei und ich kann die Nachricht sehen, die PHP in der Ausgabe sendet .nc -l 9001Anc

Wenn man das beurteilt, muss das Problem irgendwo außerhalb meines kurzen PHP-Codes liegen, aber ich habe keine Ahnung, wo ich suchen muss. Die Verbindung ist hergestellt, fwritesendet jedoch nichts.

 $fp = fsockopen("127.0.0.1", 9007, $errno, $errstr, 5); if(!$fp){ echo "$errstr ($errno)"; die(); }else{ echo "test"; // THIS IS BEING PRINTED fwrite($fp, 'msg user#idXXXXX "message"'); while(!feof($fp)){ echo fgets($fp); } fclose($fp); } 

Dies ist der gesamte fragliche Codeblock. Das testwird gedruckt, das fwritewird ausgeführt (da PHP in die while-Schleife eintritt), tg-clierhält aber nichts. Das PHP-Skript steckt dann komplett in der while-Schleife (keine Ausgabe!), Bis ich SIGTERMapache2.

Edit: Die Ausgabe von tg-cli im Debug-Modus, wenn ich versuche, die Nachricht zu senden:

*** 1538301112.516826 Accepting incoming connection *** 1538301112.517262 Read from incoming connection 

Edit2: Für weitere Berechtigungsprüfungen bin ich gelaufen sudo -u www-data echo 'dialog_list' | nc 127.0.0.1 9007- mit Erfolg.

Edit3: Ich habe auch überprüft, base64dass PHP fwritegenau das sendet, was er senden soll.

Edit4: Ich kann ausschließen, dass das Problem in der Antwort des Servers an PHP zurückliegt, da tg-cli meldet, dass es von der TCP-Verbindung liest, es aber nicht verarbeitet. Wenn ich beispielsweise shell_execoder ncauf der Shell verwende, meldet es, dass nach dem Lesen aus dem TCP-Stream eine Abfrage an das Datencenter von Telegram gesendet wurde. Dies ist nicht der Fall, wenn Sie meinen obigen PHP-Code verwenden.

Edit5: Ich habe auch versucht, mit dem TCP - Befehl Suffix \n, \roder \n\raber wieder ohne Erfolg. Könnte es sein, dass ich den Befehl mit etwas Bestimmtem beenden muss? Nichts davon ist erforderlich, wenn Sie nichts ncoder nichts verwenden shell_exec().

0
Ist das fehlende Komma nach `fwrite ($ fp`) ein Tippfehler in der Frage selbst oder im Originalcode? grawity vor 5 Jahren 0
@ grawity Es war ein Tippfehler. Das und ein anderes behoben. confetti vor 5 Jahren 0
Hat PHP eine fflush und haben Sie es nach fwrite probiert? Jonas Schäfer vor 5 Jahren 0
@ JonasSchäfer Es tut. Ich habe es versucht, keine Verhaltensänderung. Ich habe das Gefühl, dass das Thema etwas anderes legen muss. Ich kann leider nicht genau die Nachricht sehen, die "tg-cli" empfängt. Vielleicht gibt es während des Transports ein Problem? Ich weiß wirklich nicht, warum "nc" dann perfekt funktionieren würde. confetti vor 5 Jahren 0

0 Antworten auf die Frage