Доброго времени суток!!! Довелось как-то потрогать эту пресловутую утилиту "nc" на маленькой машинке UC-7112-LX-Plus с ОС Linus по SSH сессии. Понятное дело, что захотелось применять как -то автоматически. (Всё это будет работать и на Raspberry Pi с Linux(Raspbian/Debian/Ubuntu и т.д.)) Не бейте сильно, за мои косяки! Началось всё со сканирования портов в локальной сети вот этим: Понятно, что делал сам... и про подсказку не забыл: spp.sh.zip Код (Bash): www-data@Moxa:~/nsite3$ ./spp.sh use "help" www-data@Moxa:~/nsite3$ ./spp.sh help ./spp.sh -ip <ip addr> -p <ip port> - сканирование портов и адресов ./spp.sh -ip <ip addr> -p <ip port> -f <file_res> - сканирование с записью в файл если файл <file_res> не указан, то сохранение в файл "/home/httpd/ramdisk/spp.dat" ./spp.sh -ip <ip addr> -p <ip port> -fp <file_res> - сканирование несколькими потоками с записью в файл если файл <file_res> не указан, то сохранение в файл "/home/httpd/ramdisk/spp.dat" www-data@Moxa:~/nsite3$ ./spp.sh -ip 192.168.0.1-254 -p 21-80 -fp str=192 168 0 1-254 Start URL:192.168.0.1 Stop URL:192.168.0.254 Данные сохранял в файл по умолчанию. Ну вот соответственно и вывод хостов с портами с 21 по 80 в моей сети с адреса 192.168.0.1 по 192.168.0.254 Код (Bash): www-data@Moxa:~$ cat /home/httpd/ramdisk/spp.dat 192.168.0.1 23 192.168.0.1 53 192.168.0.1 80 192.168.0.31 21 192.168.0.31 22 192.168.0.31 23 192.168.0.60 22 192.168.0.67 21 192.168.0.67 22 192.168.0.67 80 192.168.0.240 21 192.168.0.240 22 192.168.0.240 23 192.168.0.241 21 192.168.0.241 22 192.168.0.241 23 www-data@Moxa:~/nsite3$ Ох и не быстрая эта процедура. Изменено, по причине того, что nc-2.0 автоматически не умеет выбирать IP4 и IP6. Просто добавлен ключик "-4" и проверено.
А вот этим делал запрос на WEB страничку: sndhttp.sh.zip Вот к моему роутеру (DIR-620): Код (Bash): ****** sndhttp.sh Date:01.12.2017 Version:01.01 - запрос по HTTP ****** ./tsndhttp.sh -str <url> <port> <str> - посылка строки <str> запроса без формирования по <url> на <port> ./tsndhttp.sh -get <url:port> <path> - посылка запроса GET на <url:port> ./tsndhttp.sh -head <url:port> <path> - посылка запроса HEAD на <url:port> ./tsndhttp.sh -options <url:port> <path> - посылка запроса OPTIONS на <url:port> ./tsndhttp.sh -trace <url:port> <path> - посылка запроса TRACE на <url:port> www-data@Moxa:~/nsite3$ ./sndhttp.sh -get 192.168.0.1 url:192.168.0.1 port:80 path:/ HTTP/1.0 200 OK Pragma: no-cache Cache-Control: no-cache, must-revalidate Content-type: text/html Expires: Tue, 02 Jan 2000 01:00:00 GMT Last-Modified: Sun, 03 Dec 2017 15:42:58 GMT Set-Cookie: user_ip=192.168.0.31 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>DIR-620</title> <meta name="date" content="" /> <meta name="generator" content="no generator" /> <meta name="copyright" content="Copyright (C) 2008 D-Link Russia" /> <meta name="keywords" content="DIR-620" /> <meta name="description" content="DIR-620" /> <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" /> <meta http-equiv="pragma" content="no-cache" /> <meta http-equiv="cache-control" content="no-cache" /> <meta http-equiv="content-style-type" content="text/css" /> <meta http-equiv="content-script-type" content="text/javascript" /> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /> <link rel="stylesheet" href="/css/jhmvc.css" type="text/css" /> <link rel="stylesheet" href="/css/login.css" type="text/css" /> <link rel="stylesheet" href="/css/common.css" type="text/css" /> <script type="text/javascript" src="/scripts/jquery.js"></script> <script type="text/javascript" src="/scripts/jquery.json.js"></script> <script type="text/javascript" src="/scripts/jhmvc.js"></script> <script type="text/javascript" src="/scripts/sm_params.js"></script> <script type="text/javascript" src="/scripts/common1.js"></script> <script type="text/javascript" src="/scripts/common2.js"></script> <script type="text/javascript" src="/scripts/login.js"></script> <script type="text/javascript" src="scripts/eng.lng.js"></script> <script>var baselang = new Object(lang);</script> <script type="text/javascript" src="scripts/rus.lng.js"></script> <script type="text/javascript" src="/scripts/config.lng.js"></script> <script type="text/javascript"> var badAuthKey = ""; window.curlang = "rus"; $(start) </script> </head> <body> <div id="wrapper"> <div class="cornerstop"> <div> </div> </div> <div class="forshadow"> <div class="forshadow2"> <div id="headerblock"> <div id="logoblock"> <img src="../image/logo_blue.gif"> <div> DIR-620 </div> </div> <div id='fastmenu'> </div> </div> <div id="rproxyinfo"> <a onClick="disconnectFromProxy();window.location.reload();"></a><span></span> </div> <div id="id_div_messages"> </div> <div id="id_div_main_container"> <form id="id_form_main" method="post" enctype="application/x-www-form-urlencoded" action="index.cgi"> <input type="hidden" name="v2" value="y"/> <input type="hidden" name="rs_type" value="html"/> <div id="id_div_login_input"> <div id="id_div_container_login_input"> <span id="hs_login"></span> <input id="A1" name="A1" type="text" maxlength="15" /> <span id="hs_password"></span> <input id="A2" name="A2" type="password" maxlength="30" /> <!-- <input type="checkbox" class="remb"> <span class="remember">Remember me</span> --> <input id="auth" name="auth" type="hidden" value="auth" /> </div> </div> <div id="id_div_login_buttons"> <div id="id_div_container_buttons"> <a id="bt_submit" class="bt" href="#"></a> <a id="bt_reset" class="bt" href="#"></a> </div> </div> </form> </div> </div> </div> <div class="cornersbottom"> <div> </div> </div> </div> </body> </html> www-data@Moxa:~/nsite3$ А вот к яндексу: Код (Bash): www-data@Moxa:~/nsite3$ ./sndhttp.sh -head www.yandex.ru url:www.yandex.ru port:80 HTTP/1.1 302 Found Date: Sun, 03 Dec 2017 11:45:31 GMT Cache-Control: no-cache,no-store,max-age=0,must-revalidate Location: https://www.yandex.ru/ Expires: Sun, 03 Dec 2017 11:45:31 GMT Last-Modified: Sun, 03 Dec 2017 11:45:31 GMT P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI" Set-Cookie: yandexuid=1532823811512301531; Expires=Wed, 01-Dec-2027 11:45:31 GMT; Domain=.yandex.ru; Path=/ X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Content-Length: 0 www-data@Moxa:~/nsite3$ Понятно, что это опыты... ведь прокси для фильтра у меня не вышел.
Вот Этим... можно сказать анализ ответа: anshttp.sh.zip Код (Bash): www-data@Moxa:~/nsite3$ ./anshttp.sh примените "help" для информации www-data@Moxa:~/nsite3$ ./anshttp.sh help ****** anshttp.sh Date:26.11.2017 Version:01.01 - анализ ответа по HTTP ****** tanshttp.sh -a <data> - анализ строки <data> tanshttp.sh -at <data> - анализ строки <data> с выводом в консоль tanshttp.sh -af <data> - анализ строки <data> с выводом в файл "/home/httpd/ramdisk/anshttp.dat" www-data@Moxa:~/nsite3$ Правда нужна и обёртка: wnsite.sh.zip ...а так же и все ранее упомянутые скрипты, что бы получить это: Код (Bash): ww-data@Moxa:~/nsite3$ ./wnsite.sh help ****** wnsite.sh Date:30.11.2017 Version:01.01 ******* help - Текущая подсказка ****** spp.sh Date:02.12.2017 Version:01.01 ****** spp <ip addr> <start_port-stop_port> - сканирование портов и адресов spps <ip addr> <ip port> <file_res> - сканирование несколькими потоками с записью в файл get_http <url:port> <path> - GET запрос к странице на <url> по умолчанию <port> = 80 head_http <url:port> <path> - HEAD запрос к странице на <url> по умолчанию <port> = 80 options_http <url:port> <path> - OPTIONS запрос к странице на <url> по умолчанию <port> = 80 trace_http <url:port> <path> - TRACE запрос к странице на <url> по умолчанию <port> = 80 www-data@Moxa:~/nsite3$ ./wnsite.sh head_http www.yandex.ru url:www.yandex.ru port:80 HTTP/1.1 302 Found Date: Sun, 03 Dec 2017 12:09:47 GMT Cache-Control: no-cache,no-store,max-age=0,must-revalidate Location: https://www.yandex.ru/ Expires: Sun, 03 Dec 2017 12:09:47 GMT Last-Modified: Sun, 03 Dec 2017 12:09:47 GMT P3P: policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI" Set-Cookie: yandexuid=9695709701512302987; Expires=Wed, 01-Dec-2027 12:09:47 GMT; Domain=.yandex.ru; Path=/ X-XSS-Protection: 1; mode=block X-Content-Type-Options: nosniff Content-Length: 0 ******* anscode=302 ***************** Ответ на запрос ****************************** Результат : 302 - Временно перемещен, Moved Temporarily. Cache-Control : no-cache,no-store,max-age=0,must-revalidate Date : Sun, 03 Dec 2017 12:09:47 GMT Location : https://www.yandex.ru/ P3P : policyref="/w3c/p3p.xml", CP="NON DSP ADM DEV PSD IVDo OUR IND STP PHY PRE NAV UNI" Last-Modified : Sun, 03 Dec 2017 12:09:47 GMT X-XSS-Protection : 1; mode=block X-Content-Type-Options : nosniff Set-Cookie : yandexuid=9695709701512302987; Expires=Wed, 01-Dec-2027 12:09:47 GMT; Domain=.yandex.ru; Path=/ Content-Length : 0 **************************************************************** www-data@Moxa:~/nsite3$
А вот этот "шатун" (пока, что заготовка) работает... выполняет функцию браузера: br1site.sh.zip Что он делает? А вот 1) запускаем: Код (Bash): www-data@Moxa:~/nsite3$ ./br1site.sh www.google.com send... analise... CMD File: File:/home/httpd/ramdisk/anshttp.dat url:www.google.com port:80 path:/ HTTP/1.0 302 Found Cache-Control: private Content-Type: text/html; charset=UTF-8 Referrer-Policy: no-referrer Location: http://www.google.ru/?gfe_rd=cr&dcr=0&ei=Du4jWqrVDYPHYLaMpoAP Content-Length: 266 Date: Sun, 03 Dec 2017 12:29:02 GMT <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>302 Moved</TITLE></HEAD><BODY> <H1>302 Moved</H1> The document has moved <A HREF="http://www.google.ru/?gfe_rd=cr&dcr=0&ei=Du4jWqrVDYPHYLaMpoAP">here</A>. </BODY></HTML> Status-Code: 302 Content-Type: text/html; charset=UTF-8 Date: Sun, 03 Dec 2017 12:29:02 GMT Content-Length: 266 Location: http://www.google.ru/?gfe_rd=cr&dcr=0&ei=Du4jWqrVDYPHYLaMpoAP P3P: =============================== 302 http://www.google.ru/?gfe_rd=cr&dcr=0&ei=Du4jWqrVDYPHYLaMpoAP =============================== И вот он получив код 302=(Временно перемещен, Moved Temporarily.) и новый путь=http://www.google.ru/?gfe_rd=cr&dcr=0&ei=Du4jWqrVDYPHYLaMpoAP снова вызывает GET, но не уходит с URL... а только путь: Код (Bash): send... analise... CMD File: File:/home/httpd/ramdisk/anshttp.dat url:www.google.com port:80 path:http://www.google.ru/?gfe_rd=cr&dcr=0&ei=Du4jWqrVDYPHYLaMpoAP HTTP/1.0 200 OK Date: Sun, 03 Dec 2017 12:29:56 GMT Expires: -1 Cache-Control: private, max-age=0 Content-Type: text/html; charset=UTF-8 P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info." Server: gws X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN Set-Cookie: 1P_JAR=2017-12-03-12; expires=Tue, 02-Jan-2018 12:29:56 GMT; path=/; domain=.google.ru Set-Cookie: NID=118=kAhFmdB5XIbkmVaZ3i8AWUbXLAoM0CUDLBwz8FcMeFQeQdgypbJP4y_KrAJjZez6ihm0RJN7KVECQEgwW9Tzl1vkwBdR4PXhK-1ifflSaask-dF7Cd86fYwdHVv11Rv5; expires=Mon, 04-Jun-2018 12:29:56 GMT; path=/; domain=.google.ru; HttpOnly Accept-Ranges: none Vary: Accept-Encoding ..... ..... а тут содержимое страницы - уж больно много. ..... И получив после анализа код 200=Ок прекращаем работу: Код (Bash): Status-Code: 200 Content-Type: text/html; charset=UTF-8 Date: Sun, 03 Dec 2017 12:29:56 GMT Content-Length: Location: P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info." =============================== 200 =============================== www-data@Moxa:~/nsite3$ Станица получена и Шатун завершил работу... почему URL внутри не меняем, а только путь? А вдруг через прокси какой-нибудь будем работать... ну это в дальнейшем.
А вот с помощью шатуна, но только через прокси: Код (Bash): www-data@Moxa:~/nsite3$ ./br1site.sh 151.80.197.192:80 http://www.google.com/ send... analise... CMD File: File:/home/httpd/ramdisk/anshttp.dat url:151.80.197.192 port:80 path:http://www.google.com/ HTTP/1.1 302 Found Date: Sun, 03 Dec 2017 13:38:17 GMT Cache-Control: private Content-Type: text/html; charset=UTF-8 Referrer-Policy: no-referrer Location: http://www.google.fr/?gfe_rd=cr&dcr=0&ei=Sf4jWqv4KOzS8AfDvaCADw Content-Length: 268 Via: 1.0 erp.ertus.fr Vary: Accept-Encoding Connection: close <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> <TITLE>302 Moved</TITLE></HEAD><BODY> <H1>302 Moved</H1> The document has moved <A HREF="http://www.google.fr/?gfe_rd=cr&dcr=0&ei=Sf4jWqv4KOzS8AfDvaCADw">here</A>. </BODY></HTML> Status-Code: 302 Content-Type: text/html; charset=UTF-8 Date: Sun, 03 Dec 2017 13:38:17 GMT Content-Length: 268 Location: http://www.google.fr/?gfe_rd=cr&dcr=0&ei=Sf4jWqv4KOzS8AfDvaCADw P3P: =============================== 302 http://www.google.fr/?gfe_rd=cr&dcr=0&ei=Sf4jWqv4KOzS8AfDvaCADw =============================== send... ....... ....... ну и так далее ...... Адрес прокси отсюда: http://proxy-list.org/english/search.php?country=western-europe
Я применял "nc" следующий: nc-2.0.zip Дело в том, что в MOXA UC-7112-LX-Plus его нет... и пришлось его компилировать. Позже выяснилось это: В Debian на ПК: Код (Bash): igor@debian-i:~/coding/bash/nsite2$ nc -vnz 192.168.0.180 Connection to 192.168.0.180 port [tcp/*] succeeded! igor@debian-i:~/coding/bash/nsite2$ А вот тоже самое на UC-7112-Lx-plus: Код (Bash): www-data@Moxa:~$ nc -vnz 192.168.0.180 192.168.0.1:80(Dlink-Router.Dlink) open www-data@Moxa:~$ Потому что ответы по разному возможна не коректрая работа скриптов. Анализ ведь по текстовому сообщению от "nc". И важно это: Дело в том, что упомянутый "nc" в MOXA сообщение "cannot connect" вывводит и при отсутствии хоста, как такового... так и при отсутствии открытого порта. В то время как в Debian сообщение "No route to host" присутствует только при отсутствии хоста... и пинг по этому адресу не проходит. Для ускорения надо применить ключ "-w <time>" вот так: Код (Bash): str=$(nc -vnz -w 1 $_startURL $_cntport 2>&1) Так, что в малине есть возможность принципиально ускорить работу
Вот кстати странность при работе с www.yandex.ru: в начале получаем путь от него (при коде 302) = https://www.yandex.ru/ - это нормально но при повторном вызове уже с ним снова получаем код 302 и путь = http://yandex.ru - заметили без "/" в конце? Это не нормально, если путь не к файлу или с дополнениями. Страницу конечно получаем, но с кодом 400 - Испорченный Запрос, Bad Request. Тем не менее у www.google.com - как обычно перенапрвление на http://www.google.ru/?<всякие крокозяблы> потом переход и получение страницы с кодом 200 - Ok. www.mail.ru - возвратил ответ код 301 - 301 Постоянно перенесен, Moved Permanently., а его я не учёл... пока не учёл
Пост 1 - Изменено, по причине того, что nc-2.0 автоматически не умеет выбирать IP4 и IP6. Просто добавлен ключик "-4" и проверено.
Вот кстати: Это результат прикручивания BASH + PHP(на устройстве) + JavaScript(на станицк в браузее) + HTML. А что происходит? Мы вводим URL в строку и start. Тут показана страница google.ru, но ввели www.google.com... и скрипт шатаясь и получая коды ответов вышел по перенаправлениям на google.ru. А вот если вместо URL указать какой-нибудь прозрачный прокси, и в пути укажем http:/www.google.com/ то выйдем в другое место... ну например к французам. Точнее французская страница googl. Изучение (познание), а так же пополнение опыта применения "nc" продолжаются.
Доброго времени суток! ...собственно хочу попросить помощи. А именно надо что бы JavaScript на странице перезапускался по setTimeout с разным параметром вот (по своему незнанию): Код (Javascript): function br1site_start(sst) { var IpUrl = document.getElementById("wIpUrl").value; var Path = document.getElementById("wPath").value; var cmd; var xmlhttp; switch(sst) { case 0: site_cmd = 0; break; case 1: cmd = "br1site.php?cmd=1&IpUrl=" + IpUrl + "&Path=" + Path + "&dtime=" + new Date().getTime(); xmlhttp = new XMLHttpRequest(); oldstrd=""; oldstrres=""; xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 ) { if(xmlhttp.status == 200){ str = xmlhttp.responseText; site_cmd = 255; document.getElementById("mydata").innerHTML = str; setTimeout('site_start(2)', 1000); } } } xmlhttp.open("GET", cmd, true); xmlhttp.send(); break; case 2: cmd = "br1site.php?cmd=2&IpUrl=" + IpUrl + "&Path=" + Path + "&dtime=" + new Date().getTime(); xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 ) { if(xmlhttp.status == 200){ strd = xmlhttp.responseText; if (oldstrd != strd) document.getElementById("mydata").innerHTML = strd; oldstrd = strd; if(site_cmd > 0) setTimeout('site_start(3)', 1000); } } } xmlhttp.open("GET", cmd, true); xmlhttp.send(); break; case 3: cmd = "br1site.php?cmd=3&IpUrl=" + IpUrl + "&Path=" + Path + "&dtime=" + new Date().getTime(); xmlhttp = new XMLHttpRequest(); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 ) { if(xmlhttp.status == 200){ strres = xmlhttp.responseText; if(strres != oldstrres) document.getElementById("Res").innerHTML = strres; oldstrres=strres; if(site_cmd > 0) setTimeout('site_start(2)', 1000); } } } xmlhttp.open("GET", cmd, true); xmlhttp.send(); break; default: site_cmd = 0; break; } } Смысл в том, что из HTML: HTML: </tr><tr> <td style="vertical-align: top; height: 16px;"> <input id="br1siteStart" name="br1siteStart" onclick="br1site_start(1)" value=" START " type="button"> </td> <td style="vertical-align: top; height: 16px;"> <input id="br1siteStart" name="br1siteStart" onclick="br1site_start(0)" value=" STOP " type="button"> </td> <td style="vertical-align: top; height: 16px;"> <input id="getStart" name="getStart" onclick="met_start('get')" value=" GET START " type="button"> </td> <td colspan="3" rowspan="7" style="vertical-align: top; height: 9px;"> <textarea id="Res" cols="80" rows="10" name="Res"></textarea></td> </tr> При нажатии на кнопку старт запускается функция onclick="br1site_start(1)... как видите с параметром 1. При этом на сервер передаётся запрос : Код (Javascript): cmd = "br1site.php?cmd=1&IpUrl=" + IpUrl + "&Path=" + Path + "&dtime=" + new Date().getTime(); Который PHP скрипт вот этот: PHP: <?php //ini_set('display_errors',1); //error_reporting(E_ALL); /************************************************************* Принимает на вход параметр $content - ответ сервера (любой метод GET, POST, :) и возвращает чистый HTML без предваряющих HTTP-заголовков ответа. **************************************************************/ function http_trim_headers($content) { return trim(substr( $content, strpos($content, "\r\n\r\n") )); } $myaddrres = gethostbyaddr($_SERVER['SERVER_ADDR']); $IpUrl = $_GET['IpUrl']; $Path = $_GET['Path']; $cmd = $_GET['cmd']; $command = ""; switch ($cmd) { case 1: //запуск $command = "rm -f /home/httpd/ramdisk/anshttp.dat &"; $res = shell_exec($command); $command = "rm -f /home/httpd/ramdisk/site.html &"; $res = shell_exec($command); $command = "./br1site.sh ".$IpUrl." ".$Path." &"; $res = shell_exec($command); echo $res; break; case 2: //чтение html $command="cat /home/httpd/ramdisk/site.html"; $res = shell_exec($command); $res2 = http_trim_headers($res); echo $res2; break; case 3: //стение answer $command="cat /home/httpd/ramdisk/anshttp.dat"; $res = shell_exec($command); echo $res; break; default: echo "unknown cmd=".$cmd; break; } // ?> с радостью выполняет, а страничка получив ответ должна выполнить: Код (Javascript): setTimeout('site_start(2)', 1000); но, как вы заметили уже с параметром 2. И позже поочерёдно должны выполняться запуски с параметрами 2 и 3. Ранее тестировал и с одинарными кавычками и без них. Можно конечно и сделать независимые функции с автоперезапуском... но хочу уменьшить нагрузку и упростить. Заранее спасибо! И не ругайте меня... моя голова не только что бы шапку носить... но я в неё ещё и ем.
Вот кстати испытал и это: Код (Javascript): setTimeout(function () { site_start(2); }, 1000); Вот взял тут: https://learn.javascript.ru/settimeout-setinterval
Братцы! Простите за мою невнимательность: Код (Javascript): setTimeout(function () { site_start(2); }, 1000); а должно быть: Код (Javascript): setTimeout(function run() { br1site_start(2); }, 1000); Извините! Этот вопрос снят!
Доброго времени суток! ...так всё-таки, что это за гадость? nsite3.zip Точно гадость! А именно реализация применения NetCat(NC) с прикрученным каким-никаким(такой задачи особо не ставилось) WEB-интерфейсом. -Сканирование хостов и открытых портов на них (нет не пинг!); -Поиск открытых (доступных) ВЕБ-страниц в сети(сетях) - "Start Free Site Search". Не обязательно в локалке. И построение их списка с сохранением их в файл на RAM-диске. С возможностью извлечения их в элемент выбора - "READ FREE SITES". Ну и чтение их в содержимого в таблицу(элемент). -Возможность перейти по какому-нибудь URL с указанием пути (http://xxxxxxxxx/). Если в качестве URL указать адрес прокси(прозрачного)... то чтение страницы будет через него. -Возможность реализовать запросы(для проверки) GET;HEAD;OPTIONS;TRACE к указанным URL и пути. -Возможность не указывать путь, а указать только URL... но уже напрямую. И... скрипт получив ответ самостоятельно перейдёт по параметру "Location:" в ответе от сервера, анализируя несколько кодов ответа. (200, 300....) -контролировать к какому хосту подключился ваш сервер, и какой хост подключился к вашему серверу. ...и это сырой тестовый вариант. Может кому интересно... и есть желание продолжить. Но! Есть нюанс с применяемой утилитой "sleep" и "usleep". В разных версиях Linux бывают и различия. А Именно: Если "sleep" умеет принимать дробные значения, такие как "sleep 0.5" (на полсекунды), то как правило отсутствует "usleep" (значения в микросекундах) в системе. А это приведет к невозможности запуска скриптов. Надо найти "usleep" и заменить на "sleep", а микросекунды заменить на дробную часть секунд 500000 - пол секунды и 0.5 - пол секунды. Всё сделано в BASH и компилировать ничего не надо. Можно применять как в консоли (благо есть подсказка при запуске), так и используя прилагаемую "шкуру" на HTML+JS+PHP. Кстати JSON выгоднее применить, чем то что там есть.
Доброго времени суток! ...если кому довелось проявить желание тестировать и т.п. это, то настоятельно рекомендую использовать RAM-диск. Категорически не рекомендую применять SSD или SD и Flash. HDD это ещё куда не шло.