PHP>无根访问Ping

时间:2015-02-16 15:16:00

标签: php performance ping nmap

我想通过一点ping脚本快速简单地ping一个ip地址,我不知道这是否可能我已经看过其他技术但是那些要求我对我的服务器有root访问权限,我不这样做。所以我想知道是否有人知道如何做到这一点我看到有几个人使用Nmap但我无法掌握它。

如果有任何想法请发帖。

1 个答案:

答案 0 :(得分:0)

您可能希望使用套接字函数来创建具有预先计算的校验和的ICMP ping数据包。这是我用来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');
啊,我错过了你需要root用户。然后你不能ICMP ping主机。但是,你可以做其他类型的ping,这可能同样好。关键是要找出主机正在运行的服务。它是运行HTTP或HTTPS的Web服务器吗?

然后你可以使用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打开与它的连接并运行命令。

如果服务正常运行,则主机处于联机状态。当然,这会检查主机网络堆栈是否在线以及服务是否正在运行。但由于你无法在没有root的情况下ping,这可能是你最好的选择。

最后,您可以随时尝试查看exec()或system()是否调用了ping'将工作,或创建具有root权限的shell脚本,然后使用PHP执行它。

这些都是我所知道的工作方式。