Não tenho certeza se isso é melhor aqui ou no SO, mas como o problema não está na programação, percebi que se aplica aqui (ou no U & L ou no serverfault, mas eu acho / espero que estou bem aqui).
Eu quero enviar comandos TCP para uma instância de telegram-cli do PHP.
Até agora eu usei: shell_exec('echo "msg user#idXXXXXX message" | nc 127.0.0.1 9007');
e funcionou bem. Mas existem variáveis e entrada do usuário envolvidas e mesmo que eu cite minhas variáveis eu acho que isso é ruim OPSEC, então ao invés disso eu quero usar PHP's
sockets , mas aqui começam os problemas.
O servidor TCP é iniciado sob o usuário "B" no servidor. PHP é executado como "www-data". Executar o shell_exec
acima funciona bem, como usuário www-data
. Estar logado como usuário A
e executar o comando diretamente em um shell bash também funciona. Usando o netcat puro eu também posso conectar ao socket como usuário A
, é por isso que acho que um problema de permissão não é o caso aqui. Usuário A
é um usuário normal sem permissões especiais.
Meu código PHP:
$fp = fsockopen("127.0.0.1", 9007, $errno, $errstr, 5);
fwrite($fp, 'msg user#idXXXX "message"');
O que isso faz é absolutamente nada.
E aqui vem a razão pela qual eu considero isso não é apropriado no StackOverflow:
Se eu tentar conectar-me à porta 9001
(para teste) em vez de 9007
(o que tg-cli é executado) depois de executar nc -l 9001
como usuário A
, ele funcionará perfeitamente e eu poderei ver mensagem PHP deve enviar na saída nc
.
A julgar por isso, o problema deve estar em algum lugar fora do meu código PHP curto, mas não tenho a menor idéia de onde procurar. A conexão é estabelecida , mas fwrite
não está enviando nada.
$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);
}
Este é todo o codeblock em questão. O test
está sendo impresso, o fwrite
está sendo executado (já que o PHP entra no loop while), mas tg-cli
não recebe nada. O script PHP então está completamente preso no laço while (sem saída!) Até eu SIGTERM
apache2.
Edit: A saída do tg-cli no modo de depuração quando tento enviar a mensagem:
*** 1538301112.516826 Accepting incoming connection
*** 1538301112.517262 Read from incoming connection
Edit2: Para mais testes de permissões, executei sudo -u www-data echo 'dialog_list' | nc 127.0.0.1 9007
- com sucesso.
Edit3: Também verifiquei novamente com base64
que o fwrite
do PHP envia exatamente o que ele deveria enviar.
Edit4: Eu posso descartar que o problema está na resposta do servidor ao PHP, pois o tg-cli relata que está lendo a conexão TCP, mas não está processando. Por exemplo. quando eu uso shell_exec
ou nc
no shell, ele informa que enviou uma consulta ao datacenter do Telegram depois de ler o fluxo TCP. Este não é o caso quando usando meu código PHP acima.
Edit5: Eu também tentei sufocar o comando TCP com \n
, \r
ou \n\r
mas novamente sem sucesso. Será que eu preciso terminar o comando com algo específico? Nada disso é necessário ao usar nc
ou shell_exec()
nua.