我不确定这在这里或在 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 9001
A
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
执行(因为 PHP 进入 while 循环)但tg-cli
没有收到任何内容。 然后 PHP 脚本完全卡在 while 循环中(没有输出!)直到我SIGTERM
apache2。
编辑:当我尝试发送消息时,调试模式下的 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:我还仔细检查了base64
PHP 是否fwrite
发送了它应该发送的内容。
编辑4:我可以排除问题出在服务器对 PHP 的响应上,因为 tg-cli 报告说它正在从 TCP 连接读取数据,但并未对其进行处理。例如,当我在 shell 上使用shell_exec
或nc
时,它会报告说它在从 TCP 流读取数据后向 Telegram 的数据中心发送了一个查询。使用上述 PHP 代码时并非如此。
编辑5:我也尝试过在 TCP 命令后面加上\n
,\r
或,但还是没有成功。是不是我需要用一些特定的东西来结束命令?使用 bare或although\n\r
时不需要这些。nc
shell_exec()