Это то, что я хочу выполнить с помощью php (возможно, используя exce ()?):
telnet для whois-регистратора, используя программу под названием proxychains:
proxychains telent whois.someregistrar 43
если не удалось -> попробуйте 1 снова
укажите имя домена для подключения:
somedomainname.com
У меня нет опыта работы с shell-скриптами, так как я могу захватить событие, в котором telnet подключен и зависает для ввода, и как его «кормить»?
Я здесь полностью или это правильный путь?
EDIT: я вижу, что python имеет хороший способ передать это, используя ожидание
Вот основной рабочий пример.
<?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_open для открытия процесса proxychains
который вызывает telnet. Он проверяет, был ли процесс успешно открыт, и если да, проверьте его статус. Пока он работает, он считывает вывод telnet в буфер и ищет вывод telnet строки, чтобы указать, что мы подключены.
Когда он обнаруживает подключенный telnet, он записывает данные в процесс, за которым следует новая строка ( \n
), а затем считывает данные из канала, в который поступают данные telnet. Как только это произойдет, он вырывается из цикла и закрывает процесс и обрабатывает.
Вы можете просмотреть выходные данные из proxychains из файла, указанного в $errFile
. Это содержит информацию о соединении, а также информацию об отладке в случае сбоя соединения.
Возможно, потребуется дополнительная проверка ошибок или управление процессами, которые могут потребоваться сделать более надежными, но если вы поместите это в функцию, вы сможете легко вызвать ее и проверить возвращаемое значение, чтобы увидеть, был ли запрос успешным ,
Надеюсь, это даст вам хорошую отправную точку.
Также ознакомьтесь с этим моим ответом для другого рабочего примера proc_open
, этот пример реализует проверку тайм-аута, поэтому вы можете выполнить поручительство, если команда не завершилась за определенное время: Создание PHP-системы классификации страниц в Linux: exec Behavior, Идентификаторы процессов и grep