0

これは私がphpを使用して達成したいことです(おそらくexce()を使用していますか?):

  1. proxychains と呼ばれるプログラムを使用して、whois レジストラに telnet で接続します。

    proxychains テレント whois.someregistrar 43

  2. 失敗した場合 -> 1 を再試行

  3. ドメイン名を接続にフィードします。

    somedomainname.com

  4. レジストラから php に返されたデータをキャプチャする

シェルスクリプトの経験がないので、telnet が接続されて入力のためにハングするイベントをどのようにキャプチャし、どのように「フィード」するのですか?

私はここで完全にオフになっていますか、それともこれが正しい方法ですか?

編集:Pythonには、expectを使用してこれを処理する良い方法があることがわかります

4

1 に答える 1

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.';
}

これはコマンドラインから実行することを意図していますが、そうである必要はありません。適当にコメントしてみました。基本的に、最初にwhoisサーバーとクエリするドメインを設定できます。

このスクリプトは、proc_openproxychainsを使用して、 telnet を呼び出すプロセスを開きます。プロセスが正常に開かれたかどうかを確認し、正常に開かれた場合は、そのステータスが実行中であることを確認します。実行中、telnet からの出力をバッファーに読み取り、接続されていることを示す文字列 telnet の出力を探します。

telnet が接続されていることを検出すると、プロセスにデータを書き込み、その後に改行 ( \n) を付けてから、telnet データが送信されるパイプからデータを読み取ります。それが発生すると、ループから抜け出し、プロセスとハンドルを閉じます。

で指定されたファイルから、proxychains からの出力を表示できます$errFile。これには、接続情報と、接続に失敗した場合のデバッグ情報が含まれます。

おそらく、より堅牢にするために実行する必要がある追加のエラーチェックまたはプロセス管理がありますが、これを関数に入れると、簡単に呼び出して戻り値をチェックして、クエリが成功したかどうかを確認できるはずです.

良い出発点になることを願っています。

の別の実例については、私のこの回答もチェックしてくださいproc_open。この例では、コマンドが一定時間内に完了しなかった場合に救済できるようにタイムアウトチェックを実装しています。 ID、grep

于 2012-07-13T01:14:49.700 に答える