Por que minha tentativa de conexão TCP via PHP está estranha?

0

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.

    
por confetti 30.09.2018 / 11:45

0 respostas