php 发送命令到端口(通过 tcp)

Posted

技术标签:

【中文标题】php 发送命令到端口(通过 tcp)【英文标题】:php send command to port (via tcp) 【发布时间】:2015-04-15 23:41:15 【问题描述】:

我正在寻找一个 php 脚本来通过 tcp 触发对特定端口的命令。该脚本在我想将这些命令发送到的同一台机器上运行,因此 ip 是 127.0.0.1 或 localhost。

命令将被定义为 url 后面写的任何内容。例如,trigger.php?screen 将发送命令“screen”,trigger.php?sound 将发送命令“sound”等。

这可能吗?我没有太多的编码知识。

简而言之:当我打开 127.0.0.1/trigger.php?sound 时,我希望通过 tcp 将命令声音发送到 127.0.0.1 端口 33000。如果这更容易用 html 或 cgi 实现,那也很好。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

您的 trigger.php 会变成这样(从 http://php.net/manual/en/sockets.examples.php 更改示例 适合您的问题;)

<?php
$DEBUG=1;

if ($DEBUG) 
     print "<pre>\n";
     error_reporting(E_ERROR | E_WARNING | E_PARSE);
     ini_set("display_errors", 1);
     ini_set('display_startup_errors',1);

if (isset($_SERVER['QUERY_STRING'])
    $cmd=$_SERVER['QUERY_STRING']; //get the command name
else
    $cmd="";

print "Command to trigger: $cmd\n";
if ($cmd!="") 
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) 
        echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
     else 
        if ($DEBUG) print "Socket created successfully\n";
        $result = socket_connect($socket, "127.0.0.1", 33000);
        if ($result === false) 
            echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
         else 
            if ($DEBUG) print "Connected successfully\n";
            socket_write($socket, $cmd, strlen($cmd));
            //Read and output possible response from the command sent
            echo "Response: ";
            while ($out = socket_read($socket, 2048)) 
                echo $out;
            
        
        socket_close($socket);
    

if ($DEBUG) print "The end.</pre>\n";

?>

(注意我没有运行它或进行语法检查,但看起来它可能是你想要的)

【讨论】:

感谢您的帮助。这似乎不起作用。当我在浏览器中打开该 php 文件时,不会显示任何内容,也不会发送任何触发器。至少根据我的日志文件,没有任何东西到达监听端口 33000 的脚本... 如您所知,您使用的服务器中存在一些未知因素,因此我们无法测试整个系统。但是我为脚本本身添加了一些调试,所以我们知道发生了什么(如果它从 HTTP 获得命令正常,如果它打开套接字/端口,如果它到达您的服务器等)让我们知道输出和问题区域应显露出来! 这是一个运行在 Debian 上的 VirtualBox 中的 apache2 网络服务器。当我打开 php 文件时,浏览器中什么也没有显示。我想通过打开此网站来触发的脚本会记录此特定端口上的每次访问(通常是GET /command HTTP/1.1,当我通过运行 ip:33000/command 访问它时,这是一个糟糕的解决方案);当我运行这个 php 时,日志中没有任何显示。出于测试目的,我已从网络中的另一台设备向该 ip&port 发送 telnet ping,这些确实显示在日志中。我做了这个 php 0755,对吗? 您从未提到要将命令转换为 HTTP 并且您的服务器是 Web 服务器。因此,您只需添加“GET /$cmd”而不仅仅是 $cmd 和 HTTP 标头(因为您并不真的想将命令发送到服务器,但您想将命令转换为包含该命令的 HTTP 请求)。无法从您的问题中得到答案 - 只需添加 HTTP 标头和 GET。 很抱歉。我仍在学习,不知道这是必须提及的。该脚本现在可以完美运行了:)【参考方案2】:

所以我做了一些关于通过 php 发送 telnet 命令的研究,并找到了一个类似于我需要的脚本。我已经修改它并添加了user3134164的行来获取命令名称。

脚本看起来像这样并且运行良好。我打开 phptrigger.php?command 并且我放在问号后面的任何内容都将按计划执行。非常感谢您的帮助,user3134164 :)

<?php
    $socket = fsockopen("localhost", "33000", $errno, $errstr); 
    $cmd=$_SERVER['QUERY_STRING']; 

    if($socket) 
     
        echo "Connected. <br /><br />"; 
    
    else 
     
        echo "Connection failed!<br /><br />"; 
    

    fputs($socket, "get /$cmd \r\n"); 
    $buffer = ""; 

    while(!feof($socket)) 
     
        $buffer .=fgets($socket, 4096); 
     

    print_r($buffer); 
    echo "<br /><br /><br />"; 

    var_dump($buffer); 

    fclose($socket); 
?> 

【讨论】:

以上是关于php 发送命令到端口(通过 tcp)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 监听 TCP 端口? [关闭]

PING命令就是向主机发UDP数据包,但是啥端口

使用 ngrok 使用 tcp 隧道将数据发送到 tcp 端口时出错

使用 python 的 TCP 端口 - 如何将命令输出转发到 tcp 端口?

ESP32 TCP客户端

UDP/TCP 发送和接收,无需端口转发