Почему моя попытка TCP-соединения через PHP ведет себя странно?

357
confetti

Я не уверен, лучше ли это здесь или в SO, но поскольку проблема не в программировании, я подумал, что это применимо здесь (или в U & L, или в случае отказа сервера, но я думаю / надеюсь, у меня все хорошо).

Я хочу отправить команды TCP на экземпляр telegram-cli из PHP.

До сих пор я пользовался: shell_exec('echo "msg user#idXXXXXX message" | nc 127.0.0.1 9007');и все работало нормально. Но здесь задействованы переменные и пользовательский ввод, и хотя я цитирую свои переменные, я считаю, что это плохой OPSEC, поэтому вместо этого я хочу использовать сокеты PHP, но здесь начинаются проблемы.

Сервер TCP запускается под пользователем «B» на сервере. PHP работает как "www-данные". Запуск вышеуказанного shell_execработает нормально, как пользователь www-data. Вход в систему как пользователь Aи запуск команды непосредственно в оболочке bash также работает. Используя чистый netcat, я также могу подключиться к сокету как пользователь A, поэтому я думаю, что проблема с разрешениями здесь не в этом. Пользователь A- обычный пользователь без специальных разрешений.

Мой код PHP:

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

То, что это делает, абсолютно ничего.
И вот почему я считаю, что это не подходит для StackOverflow:

Если я попытаюсь подключиться к порту 9001(для тестирования) вместо 9007(на котором работает tg-cli) после запуска nc -l 9001от имени пользователя A, он работает отлично, и я вижу сообщение, которое PHP должен отправить на ncвыходе.

Судя по этому, проблема должна быть где-то вне моего короткого кода PHP, но я понятия не имею, где искать. Соединение установлено, но fwriteничего не отправляется.

 $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); } 

Это весь рассматриваемый кодовый блок. testПечатается, то fwriteв настоящее время выполняется (так как РНР входит в цикл пока), но tg-cliничего не получает. Затем скрипт PHP полностью застрял в цикле while (без вывода!), SIGTERMПока я не установлю apache2.

Редактировать: вывод tg-cli в режиме отладки, когда я пытаюсь отправить сообщение:

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

Edit2: для дальнейшего тестирования разрешений я запустил sudo -u www-data echo 'dialog_list' | nc 127.0.0.1 9007- с успехом.

Edit3: я также дважды проверил, base64что PHP fwriteотправляет именно то, что он должен отправлять.

Edit4: я могу исключить, что проблема заключается в ответе сервера обратно в PHP, поскольку tg-cli сообщает, что он читает из TCP-соединения, но не обрабатывает его. Например, когда я использую shell_execили ncна оболочке, он сообщает, что после чтения из потока TCP отправил запрос в центр данных Telegram. Это не тот случай, когда используется мой код PHP выше.

Edit5: Я также попытался суффикс команды TCP с \n, \rили, \n\rно снова безуспешно. Может быть, мне нужно закончить команду чем-то конкретным? Ничего из этого не требуется при использовании голых ncили shell_exec()хотя.

0
Является ли пропущенная запятая после `fwrite ($ fp`) опечаткой в ​​самом вопросе или в исходном коде? grawity 5 лет назад 0
@ Grawity Это была опечатка. Исправлена ​​эта и другая тоже. confetti 5 лет назад 0
PHP имеет fflush, и вы пытались использовать его после fwrite? Jonas Schäfer 5 лет назад 0
@ JonasSchäfer Это так. Я пытался, без изменений в поведении. Я чувствую, что проблема должна заключаться в другом. К сожалению, я не вижу точного сообщения, которое получает tg-cli, так что, возможно, во время транспортировки возникла проблема? Я действительно не знаю, почему тогда `nc` будет работать отлично. confetti 5 лет назад 0

0 ответов на вопрос

Похожие вопросы