Пинг из динамического языка без использования пинга - PullRequest
0 голосов
/ 18 июня 2009

Я нахожусь в системе Linux, где мне не разрешено использовать приложение ping (ping: icmp open socket: операция не разрешена). Однако сценарий, который я пишу (PHP, но я могу использовать вызов exec () для любого сценария / программы, если это необходимо), должен определить, является ли хост «живым». Как я могу сделать это без использования «ping»?

Ответы [ 5 ]

2 голосов
/ 18 июня 2009

Если ping не может сделать это, вы не можете сделать это на другом языке. Вот аналогия, которая может помочь вам понять, почему. Допустим, в файловой системе есть файл, и вы хотите его содержимое. Вы запускаете cat filename, и он говорит cat: filename: Permission denied. Как вы думаете, Perl (или любой другой язык) будет лучше, чем C здесь? Давайте попробуем:

#!/usr/bin/perl

use strict;
use warnings;


die "usage: $0 filename" unless @ARGV == 1;
my $filename = shift;

open my $fh, "<", $filename
    or die "could not open $filename: $!\n";

print while <$fh>;

При запуске с файлом появляется сообщение could not open filename: Permission denied. Неважно, на каком языке вы пытаетесь использовать, вы получите Operation not permitted.

Тем не менее, существуют и другие методы определения, жива ли машина. Если есть сервер, который, как известно, всегда работает на компьютере, вы можете попытаться подключиться к нему. Обратите внимание, что вам не нужно завершать соединение (например, войти в систему), достаточно лишь одного факта, что вы можете успешно инициировать соединение, чтобы знать, что окно установлено.

1 голос
/ 30 марта 2011

Или вы можете установить бит SUID для программы "ping" в unix;)

1 голос
/ 18 июня 2009

Чтобы выполнить пинг (ICMP), вам нужен root-доступ.

Единственный способ сделать это - TCP или UDP-пинг . Если вам нужен пример, проверьте код Cacti или вы можете использовать hping, чтобы сделать это за вас

0 голосов
/ 18 июня 2009

Руководство по PHP предоставляет предоставленный пользователем код для реализации пинга в PHP . К сожалению, для этого требуется доступ с правами root, поэтому вряд ли вы сможете его использовать. Один из вариантов - использовать curl и посмотреть значения, возвращаемые curl_getinfo () :

c = curl_init('http://www.site.com/');
curl_exec($c);
$info = curl_getinfo($ch);

Это совсем не то же самое, что пинг, но все же, возможно, подходит для ваших нужд.

0 голосов
/ 18 июня 2009

http://us2.php.net/manual-lookup.php?pattern=socket

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

...