Получить список переходов traceroute с помощью php

shell_exec("traceroute IPaddress) возвращает traceroute to IPaddress (IPaddress), 30 hops max, 40 byte packets

Как мне получить фактический список прыжков, чтобы я мог сказать, где возникает проблема?


person Nick Iredale    schedule 04.12.2012    source источник
comment
Проверьте adayinthelifeof.nl/2010/07/ 30/ или stackoverflow.com/questions/10965891/   -  person Hugo Delsing    schedule 04.12.2012
comment
Я не могу заставить это работать - вероятно, причиной является незнание того, как построить команду с параметрами в ней!   -  person Nick Iredale    schedule 04.12.2012


Ответы (2)


Эти сообщения должны быть записаны в stderr вместо обычного stdout, поэтому я не совсем понимаю, почему вы видите их в выводе.

Вместо shell_exec() я бы рекомендовал использовать exec(), потому что он захватывает как вывод, так и код возврата процесса:

exec('traceroute example.com 2>&1', $out, $code);
if ($code) {
    die("An error occurred while trying to traceroute: " . join("\n", $out);
}
print_r($out);

Чтобы немного ускорить команду, вы можете использовать опцию -n при запуске traceroute, чтобы избежать необходимости выполнять поиск DNS для промежуточных переходов.

Обратите внимание, что запуск traceroute может занять некоторое время; если вы запустите его в командной строке, вы иногда можете увидеть строки с * * * в них, что может занять целую вечность!

person Ja͢ck    schedule 04.12.2012
comment
Это также возвращает Array ( [0] => traceroute to 88.97.30.31 (88.97.30.31), 30 hops max, 40 byte packets ) — что определяет переменную $code? - person Nick Iredale; 04.12.2012
comment
@NickIredale Тогда ваш traceroute испорчен, он должен напечатать это сообщение stderr; $code дает возвращаемое значение команды; 0 означает отсутствие ошибок, все остальное означает, что что-то пошло не так. - person Ja͢ck; 04.12.2012
comment
ах! печать $code дает 1, а не 0, поэтому, как вы говорите, это не работает. Если да, то команда должна выдать список переходов, не так ли? - person Nick Iredale; 04.12.2012
comment
Чтобы распечатать ошибки, вы можете сделать exec('traceroute example.com 2>&1', $out, $code). - person Ja͢ck; 04.12.2012
comment
Спасибо, вы очень помогли :) Теперь он возвращает Array ( [0] => traceroute to example.com (192.0.43.10), 30 hops max, 40 byte packets [1] => send: Operation not permitted ) 1, поэтому сервер должен быть настроен для предотвращения этого - я свяжусь со своим хостом и посмотрю, что можно сделать, если что-нибудь - person Nick Iredale; 04.12.2012
comment
По соображениям безопасности доступ к оболочке на моем сервере запрещен — ну что ж, стоит попробовать. - person Nick Iredale; 07.12.2012
comment
@ Джек Можете ли вы объяснить, что означает 2›&1? Я пробовал с ним и без него и получил разные результаты. Я хотел бы знать, что это значит и на какой из них я мог бы положиться больше всего. Дайте хотя бы ссылку, где почитать об этом, я пытался гуглить, но безуспешно. - person Colandus; 05.10.2013
comment
Я кое-что читал, что это значит, по их словам, это только ошибки? Я не понимаю, почему тогда я получаю другие результаты. Я могу отправить вам свои результаты в частном порядке, если вы хотите взглянуть на них. - person Colandus; 05.10.2013

Используйте exec и посмотрите на его второй параметр:

string exec ( string $command [, array &$output [, int &$return_var ]] )

Пример :

<?php

exec('traceroute test.com -m 2', $output);
var_dump($output); 
person Sorin Trimbitas    schedule 04.12.2012
comment
Спасибо, только что попробовал, но результат фактически такой же, как и исходный код - массив содержит только одну переменную - array(1) { [0]=> string(69) "traceroute to 88.97.30.31 (88.97.30.31), 30 hops max, 40 byte packets" }, которая является сводкой трассировки, а не списком переходов. - person Nick Iredale; 04.12.2012
comment
см. отредактированное сообщение, параметр m означает количество переходов .. traceroute --help для более подробной информации - person Sorin Trimbitas; 04.12.2012
comment
отредактированная версия по-прежнему возвращает то же самое - array(1) { [0]=> string(68) "traceroute to 88.97.30.31 (88.97.30.31), 2 hops max, 40 byte packets" } - person Nick Iredale; 04.12.2012
comment
для меня он возвращает правильный вывод ... массив (размер = 3) 0 => строка 'traceroute to test.com (174.36.85.72), максимум 2 перехода, 60-байтовые пакеты' (длина = 66) 1 => строка ' 1 * * *' (длина=9) 2 => строка ' 2 * * *' (длина=9) - person Sorin Trimbitas; 04.12.2012
comment
Сервер не разрешает, поэтому работать не будет. Спасибо за вашу помощь - person Nick Iredale; 04.12.2012