Почему моя попытка TCP-соединения через PHP ведет себя странно?
Я не уверен, лучше ли это здесь или в 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 ответов на вопрос
Похожие вопросы
-
9
В чем разница между командами "su -s" и "sudo -s"?
-
4
Требуется хороший бесплатный образ Ubuntu Server VMWare
-
4
Каковы различия между основными дистрибутивами Linux? Я замечу?
-
-
2
Ограничить использование процессора для Flash в Firefox?
-
2
Как мне заставить мой микрофон работать под Debian GNOME?
-
2
Конки установки - образцы / идеи?
-
3
Каковы различия между оконными менеджерами Linux?
-
2
ThunderBird / Синхронизация освещения с SE k770i
-
4
Файловая система Linux
-
6
Полноэкранная медленная вспышка в KDE 4