Можно ли сделать traceroute в браузере?

Я ищу способ сделать клиентскую часть traceroute, то есть в браузере.

Насколько мне известно, невозможно отправлять ICMP, UDP или TCP-пакеты с произвольными значениями TTL через Javascript или Flash. Я знаю, что Flash разрешает TCP-соединения через класс Socket в ActionScript, но это не кажется полезным для реализации traceroute.

Является единственным решением для разработки плагина для браузера?

EDIT: я только узнал, что это было сделано с помощью Java-апплета: http://www.codefromthe70s.org/traceroute.aspx

Плохая новость заключается в том, что этот апплет требует подписания кода, поскольку он фактически анализирует вывод из исполняемого файла ping базовой клиентской системы. Из-за этого пользователю предлагается разрешить запуск приложения Java, что является громоздким.

Дополнительная информация здесь: http://www.codefromthe70s.org/traceroute_explained.aspx

Я все еще ищу более простое решение, если кто-то может помочь.

EDIT 2: Спасибо за ваши ответы. Думаю, мне придется пойти с Java.

Интересно, будет ли NaCl (http://code.google.com/p/nativeclient/) поддерживать какое-то приложение traceroute.

Ответы

Ответ 1

Вы не можете сделать это вообще из браузера. Javascript может в лучшем случае открыть соединение с исходным сервером для запросов AJAX, но может делать это только через HTTP. Flash может разговаривать с произвольными хостами, но только если они указаны в файле crossdomain.xml на исходном сервере и снова только через TCP. Поддержка UDP во Flash, по-видимому, ожидается.

Traceroute и ping - это протоколы, основанные на ICMP, и не могут быть созданы/управляются с помощью Flash или Javascript. Они также требуют "сырого" доступа для создания пользовательских пакетов, и это определенно не может быть сделано на стороне браузера. Вот почему "ping" - это программа "SUID" для Unix-систем, поскольку для доступа к пакетному доступу требуются привилегии root.

В лучшем случае вы можете выполнить серверную реализацию и получить вывод, отправленный в браузер. И даже тогда вы, скорее всего, не смогли бы сделать это из процесса на сервере в окне Unix, поскольку веб-сервер вряд ли будет работать от имени root. Вам нужно будет выполнить ping системы и/или traceroute и перенаправить вывод обратно в браузер.

Ответ 2

Почему бы вам просто не подписать апплет? Разве проблема не в том, что вы еще не знаете, как подписать апплет? Если да, тогда начинайте здесь: jarsigner. Здесь - более четкое руководство.

На самом деле нет более простого/лучшего решения, чем фактически запускать часть кода и/или команд на клиентской машине. Traceroute действительно должен возникнуть на клиентской машине.

Javascript и ActionScript не могут этого сделать из-за ограничений безопасности. Они живут только в контексте веб-страницы. Silverlight, возможно, сможет это сделать, но не прикасайтесь ко мне. Я не делаю NET.

Ответ 3

Существует расширение браузера CoNetServ (Комплексные сетевые сервисы). Он может выполнять трассировку с вашего локального компьютера прямо в браузере. https://github.com/VojtechVitek/CoNetServ/wiki

Расширение Chrome: https://chrome.google.com/extensions/detail/mmkpilpdijdbifpgkpdndpjlkpjkihee Дополнение Firefox: https://addons.mozilla.org/en-US/firefox/addon/181909/


ОБНОВЛЕНИЕ: И Chrome, и Firefox отменили объединение библиотек NPAPI в расширения/дополнения. К сожалению, вышесказанное больше не будет работать.

Ответ 4

Хм... нет, из-за модели безопасности.

может иметь возможность делать это в определенном браузере с помощью подключаемого модуля, но не с любым браузером, использующим что-либо широко доступное.

Мне бы хотелось, чтобы здесь было неправильно.

Ответ 5

Как насчет выполнения traceroute на сервере и возврата результата с somekind ajax-вызова

Ответ 7

Вам не нужно создавать апплет и подписывать его! Можно использовать java из javascript. Я сделал script для выполнения traceroute с ActiveX или Java.

Я не вижу никаких предупреждений о безопасности на OS X. Попробуйте это в Windows и Linux и скажите мне, что происходит: -)

UPD: кажется, что он работает только в Firefox

Ответ 8

<script type="text/javascript">
        function runapp() {
        var domain = "10.10.35.1";
        var cmdLine = "tracert" +" " + domain; 
        var wshShell = new ActiveXObject("WScript.Shell"); 
        var out = wshShell.Exec(cmdLine); 
        var output1 = out.StdOut.ReadAll();
        document.getElementById('box').innerHTML += output1;
        }

     </script>

<div id="box" align="center"></div>
    <button onclick="runapp();">Click me!</button>

Таким образом, он работает только в IE из-за ActiveX.

Он будет запускать traceroute до 10.10.35.1 и записать вывод в div с id = "box".