为什么我通过 PHP 尝试进行 TCP 连接时出现异常?

为什么我通过 PHP 尝试进行 TCP 连接时出现异常?

我不确定这在这里或在 SO 上是否更好,但由于问题不在编程中,我认为它适用于这里(或在 U&L 或 serverfault 上,但我猜/希望我在这里没问题)。

我想发送 TCP 命令到telegram-cli来自 PHP。

到目前为止,我使用:shell_exec('echo "msg user#idXXXXXX message" | nc 127.0.0.1 9007');并且它工作正常。但是其中涉及变量和用户输入,尽管我引用了我的变量,但我认为这是错误的 OPSEC,所以我想使用 PHP 的 套接字,但问题就从这里开始了。

TCP 服务器在服务器上以用户“B”的身份启动。PHP 以“www-data”的身份运行。shell_exec以用户身份运行上述程序可以正常工作。www-data以用户身份登录A并直接在 bash shell 中运行命令也可以正常工作。使用裸 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 运行的端口),它可以正常工作,并且我可以在输出中看到 PHP 应该发送的消息。nc -l 9001Anc

从这一点来看,问题一定出在我的简短的 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执行(因为 PHP 进入 while 循环)但tg-cli没有收到任何内容。 然后 PHP 脚本完全卡在 while 循环中(没有输出!)直到我SIGTERMapache2。

编辑:当我尝试发送消息时,调试模式下的 tg-cli 的输出:

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

编辑2:为了进行进一步的权限测试,我进行了sudo -u www-data echo 'dialog_list' | nc 127.0.0.1 9007成功测试。

编辑3:我还仔细检查了base64PHP 是否fwrite发送了它应该发送的内容。

编辑4:我可以排除问题出在服务器对 PHP 的响应上,因为 tg-cli 报告说它正在从 TCP 连接读取数据,但并未对其进行处理。例如,当我在 shell 上使用shell_execnc时,它会报告说它在从 TCP 流读取数据后向 Telegram 的数据中心发送了一个查询。使用上述 PHP 代码时并非如此。

编辑5:我也尝试过在 TCP 命令后面加上\n,\r或,但还是没有成功。是不是我需要用一些特定的东西来结束命令?使用 bare或although\n\r时不需要这些。ncshell_exec()

相关内容