Пинг из динамического языка без использования пинга
-
06-07-2019 - |
Вопрос
Я в системе Linux, где мне не разрешено использовать приложение ping (ping: icmp open socket: операция не разрешена). Однако сценарий, который я пишу (PHP, но я могу использовать вызов exec () для любого сценария / программы, если это необходимо), должен определить, является ли хост «живым». Как я могу это сделать, не используя «ping»?
Решение
Если ping не может этого сделать, вы не можете сделать это на другом языке. Вот аналогия, которая может помочь вам понять, почему. Допустим, в файловой системе есть файл, и вы хотите его содержимое. Вы запускаете cat filename
и он говорит, что cat: filename: Permission denied
. Как вы думаете, Perl (или любой другой язык) будет лучше, чем C здесь? Давайте попробуем:
#!/usr/bin/perl
use strict;
use warnings;
die "usage: <*> filename" unless @ARGV == 1;
my $filename = shift;
open my $fh, "<", $filename
or die "could not open $filename: $!\n";
print while <$fh>;
При запуске с файлом сообщается, что не удалось открыть имя файла: разрешение отклонено
. Независимо от того, какой язык вы пытаетесь использовать, вы получите Операция не разрешена
.
Тем не менее, существуют и другие методы определения, жива ли машина. Если есть сервер, который, как известно, всегда работает на компьютере, вы можете попытаться подключиться к нему. Обратите внимание, что вам не нужно завершать соединение (например, войти в систему), достаточно лишь одного факта, что вы можете успешно инициировать соединение, чтобы знать, что окно установлено.
Другие советы
Чтобы выполнить пинг (ICMP), вам нужен root-доступ.
Единственный способ сделать это - выполнить TCP или UDP-пинг . Если вам нужен пример, проверьте код Cacti или вы можете использовать hping, чтобы сделать это для вас
Или вы можете установить бит SUID в " ping " программа на unix;)
http://us2.php.net/manual-lookup.php ? = шаблон сокета р>
Но если вы не можете открыть сокет с помощью ping, вряд ли вы сможете использовать любой из них. Поговорите со своим хостинг-провайдером.
Руководство по PHP предоставляет предоставленный пользователем код для реализации пинг в PHP . К сожалению, для этого требуется доступ с правами root, поэтому вряд ли вы сможете его использовать. Один из вариантов - использовать curl и посмотреть на значения, возвращаемые curl_getinfo () :
c = curl_init('http://www.site.com/');
curl_exec($c);
$info = curl_getinfo($ch);
Это совсем не то же самое, что пинг, но все же, возможно, подходит для ваших нужд.