2011-01-13 7 views
1

Я пытаюсь сделать это на PHP. Мне нужно проверить, если указанный хост «вверх»Есть ли способ проверить, есть ли хост?

Я думал пинг указанного хоста (хотя я не знаю, как я бы, так как это потребовало бы корень. --help здесь?)

Я также хочу использовать fsockopen(), чтобы попытаться подключиться к указанному порту, но это тоже не получится, если хост не прослушивает подключения к этому порту.

Кроме того, некоторые хосты блокируют запросы ping, поэтому как я могу обойти это? Однако эта часть не является необходимостью, поэтому не беспокойтесь об этом слишком много. Я понимаю, что это может показаться сложным.

+3

Какую услугу вы хотите проверить-Несс для? –

+0

Хозяин в целом. Никакой конкретной услуги. В принципе, если хост находится в сети. У некоторых хостов нет веб-сервера или чего-то еще, так что это будет сложно. – Rob

ответ

3

Короткий ответ заключается в том, что нет хорошего, универсального способа сделать это. Ping примерно так же близко, как вы можете получить (почти все хосты ответят на это), но, как вы заметили, на PHP, который обычно требует доступа root для использования низкого порта.

Позволяет ли ваш хост выполнять системные вызовы, чтобы вы могли запускать команду ping на уровне ОС и затем анализировать результаты? Вероятно, это ваш лучший выбор.

$result = exec("ping -c 2 google.com"); 

Если хост блокирует запрос пинг, вы могли бы сделать более общий Portscan искать другие открытые порты (но это довольно грубо, не делают его хозяев, которые не давали вам конкретные разрешение). Nmap - хороший инструмент для этого. Он использует довольно много трюков, чтобы выяснить, есть ли хост и какие службы могут работать или не работать. Однако будьте осторожны, так как некоторые хостинг-провайдеры прекратят использование вашей учетной записи для «хакерской активности», если вы устанавливаете и используете Nmap, особенно против хостов, которые вы не контролируете или не имеете разрешения на зондирование.

Кроме того, если вы находитесь на одном и том же непереключенном сетевом уровне в качестве другого хоста (например, если вы, например, находитесь в одной открытой сети WiFi), адаптер ethernet в беспорядочном режиме может обнюхать трафик с хоста и с него даже если он не отвечает непосредственно вам.

+0

Будет ли exec() не требовать root? – Rob

+0

Для этого exec обычно не требуется root. Ping обычно разрешен для обычных пользователей, а 'exec' никогда не требовал root в PHP. «Exec» будет работать с теми же правами, что и любой пользовательский PHP. –

+0

Не позволял мне. 'ping: icmp open socket: операция не разрешена' – Rob

4

Я обычно делаю простую cURL для общедоступной страницы и вижу, возвращает ли она 200. Если вы получаете 500, 404 или что-нибудь кроме 200 ответов, вы знаете, что что-то подозрительное.

+2

thats мой путь тоже, addionitally его полезно просто использовать запрос HEAD. Гораздо быстрее и достаточно информации. –

+0

Кому-то этот ответ должен был объяснить, почему он неверен или отсутствует. – buley

0

Для того чтобы контролировать хост вообще, должен быть открыт хотя бы один порт. Является ли хост веб-сервером? Если это так, вы можете просто открыть соединение с портом 80, если оно открыто, то работает хотя бы часть хоста.

Лучшим решением было бы иметь скрипт, доступный только для вашего монитора, а затем вы можете открыть соединение с ним, и этот скрипт вернет различные биты информации о системе.

EDIT--

Как кап вы хотите, чтобы это испытание быть? [server on] -> [apache running] -> [работа в веб-приложении] Все разные уровни работы. Просто показывая, что apache возвращает что-то, по крайней мере, показывает, что сервер включен, но не работает ваше веб-приложение. (я понимаю, что вы не можете быть запущен ничего подобного, но я надеюсь, что это полезный пример)

EDIT--

Будет ли стоит установить облегченный сервер HTTP (я имею в виду очень легкий вес) только для мониторинг?

Не удалось установить что-то на хосты, которые часто звонили домой, чтобы показать, что они поднялись?

1

Вы можете использовать Curl

$url = 'yoururl'; 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_exec($ch); 
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 
if (200==$retcode) { 
    // All's well 
} else { 
    // not so much 
} 
+1

И если на этом узле не работает веб-сервер? Или это не порт 80? –

+0

Если он не запущен, домен не существует или он не находится на порту 80, тогда $ retcode вернет int (0). Если вам нужно проверить другие порты, добавьте номер порта. Мы используем это решение в производственной среде в течение длительного времени без каких-либо проблем. –

Смежные вопросы