PHP> Ping без рут-доступа

0

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

Если у кого есть идеи, напишите.

  • 0
    Настоящий ICMP-пакет требует корневых привилегий для генерации. Сама команда ping запускается от имени пользователя root (с залипшим битом) в ОС Linux.
Теги:
performance
ping
nmap

1 ответ

0

Вы можете использовать функции сокета для создания пакета ping ICMP с предварительно вычисленной контрольной суммой. Здесь код, который я использую для ping из PHP:

function pingHost($host, $timeout=1) {
  $payload = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
  $socket = socket_create(AF_INET, SOCK_RAW, 1);

  socket_set_options(
    $socket,
    SOL_SOCKET,
    SO_RCVTIMEO,
    array(
      'sec' => $timeout,
      'usec' => 0,
    )
  );
  socket_connect($socket, $host, 0);
  socket_send($socket, $payload, strlen($payload), 0);

  if (socket_read($socket, 255) === false) {
    $result = true;
  } else {
    $result = false;
  }

  socket_close($socket);
  return $result;
}

echo pingHost('myhostname');

Ах, я пропустил, что для этого вам нужен корень. Затем вы не можете ICMP пинговать хост. Тем не менее, вы можете делать другие типы pinging, которые могут быть столь же хорошими. Ключ должен выяснить, какие службы хост работает. Это веб-сервер с HTTP или HTTPS?

Затем вы можете использовать cURL.

// http://css-tricks.com/snippets/php/check-if-website-is-available/
function isDomainAvailible($domain)
   {
           //check, if a valid url is provided
           if(!filter_var($domain, FILTER_VALIDATE_URL))
           {
                   return false;
           }

           //initialize curl
           $curlInit = curl_init($domain);
           curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,10);
           curl_setopt($curlInit,CURLOPT_HEADER,true);
           curl_setopt($curlInit,CURLOPT_NOBODY,true);
           curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true);

           //get answer
           $response = curl_exec($curlInit);

           curl_close($curlInit);

           if ($response) return true;

           return false;
   }

Если curl недоступен, вы должны иметь возможность использовать get_file_contents() с известным допустимым URL-адресом.

Это сервер db, скажем, mysql или mssql? Сделайте что-то подобное, но используйте PDO, чтобы открыть соединение с ним и выполнить команду.

Если служба работает, хост находится в сети. Конечно, это проверяет, находится ли сетевой сетевой узел хоста и если служба запущена. Но так как вы не можете ping без root, это может быть вашим лучшим выбором.

Наконец, вы всегда можете попробовать и посмотреть, будет ли вызов exec() или system() на "ping" работать или создать сценарий оболочки с привилегиями root, а затем выполнить его с помощью PHP.

Это все, что я знаю.

  • 0
    Операция не допускается: P не может сделать розетку.
  • 0
    Я отредактировал ответ для некоторых альтернатив потоков.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню