如何捕获和使用PHP和shell脚本饲料的telnet?(How to capture and fe

2019-06-26 05:46发布

这就是我想用PHP(可能使用EXCE()?)来完成:

  1. telnet到使用程序调用proxychains一个域名注册登记处:

    proxychains TELENT whois.someregistrar 43

  2. 如果失败 - >再次尝试1

  3. 喂域名连接:

    somedomainname.com

  4. 捕获的数据由注册商返回PHP

我有一个shell脚本没有经验,所以我如何捕捉其中的telnet连接,并挂起了输入和我如何“喂”它的事件?

我是完全以在这里下车或者这是去了解它的正确方法?

编辑:我看到蟒蛇有韩德尔此使用的好办法期待

Answer 1:

下面是一个基本工作示例。

<?php

$whois   = 'whois.isoc.org.il';            // server to connect to for whois
$data    = 'drew.co.il';                   // query to send to whois server
$errFile = '/tmp/error-output.txt';        // where stderr gets written to
$command = "proxychains telnet $whois 43"; // command to run for making query

// variables to pass to proc_open
$cwd            = '/tmp';
$env            = null;
$descriptorspec = array(
        0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
        1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
        2 => array("file", "/tmp/error-output.txt", "a") // stderr is a file to write to
);

// process output goes here
$output  = '';

// store return value on failure
$return_value = null;

// open the process
$process = proc_open($command, $descriptorspec, $pipes, $cwd, $env);

if (is_resource($process)) {
    echo "Opened process...\n";

    $readBuf = '';

    // infinite loop until process returns
    for(;;) {
        usleep(100000); // dont consume too many resources

        // TODO: implement a timeout

        $stat = proc_get_status($process); // get info on process

        if ($stat['running']) { // still running
            $read = fread($pipes[1], 4096);
            if ($read) {
                $readBuf .= $read;
            }

            // read output to determine if telnet connected successfully
            if (strpos($readBuf, "Connected to $whois") !== false) {
                // write our query to process and append newline to initiate
                fwrite($pipes[0], $data . "\n");

                // read the output of the process
                $output = stream_get_contents($pipes[1]);
                break;
            }
        } else {
            // process finished before we could do anything
            $output       = stream_get_contents($pipes[1]); // get output of command
            $return_value = $stat['exitcode']; // set exit code
            break;
        }
    }

    echo "Execution completed.\n";

    if ($return_value != null) {
        var_dump($return_value, file_get_contents($errFile));
    } else {
        var_dump($output);
    }

    // close pipes
    fclose($pipes[1]);
    fclose($pipes[0]);

    // close process
    proc_close($process);
} else {
    echo 'Failed to open process.';
}

这意味着要在命令行中运行,但它并没有要。 我试图评论它相当好。 基本上在一开始可以设置域名服务器,并查询域。

该脚本使用proc_open打开proxychains过程调用远程登录。 它检查进程是否被成功打开,如果是检查其状态运行。 虽然它的运行,它会读取来自远程登录的输出到缓冲区,然后查找字符串的telnet输出,以表明我们正在连接。

一旦它检测到的telnet连接,它的数据写入过程跟着一个新行( \n ),然后读取来自其中的telnet数据进入管道中的数据。 一旦出现这种情况它打破了循环和关闭的过程和把手。

您可以从指定的文件查看从proxychains输出$errFile 。 这包含在连接失败的情况下连接信息和调试信息。

有可能是一些额外的错误检查或流程管理,可能需要工作要做,以使其更加坚固,但如果你把这个变成一个功能,你应该能够很容易地把它和检查返回值,看看是否查询成功。

希望给你一个很好的起点。

还检查了我的这个答案的另一实施proc_open ,这个例子实现了一个超时检查,以便您可以保释如果命令尚未在一定的时间内完成: 在Linux上创建一个PHP在线分级系统:EXEC行为,进程ID,和grep



文章来源: How to capture and feed telnet using php and shell scripting?