Page 1 sur 1

Faire un ping sans exec, shell_exec ou system ?

Posté : 25 mars 2012 11:00
par jeje3030
bonjour, :D
je voudrais faire un ping d'un serveur distant mais sur internet la plupart de codes PHP utilisent les fonctions exec, system ou shell_exec, qui sont désactivées sur legtux. Il me semble qu'avec les socket il est impossible de pouvoir avoir le ping.Voila mon code, que je n'ai pas pu tester :

Code : Tout sélectionner

$exec = exec('ping '.$ip_serv_co);
echo 'Ping : ' . $exec;
que puis-je faire ? quel code PHP utiliser ?
merci d'avance-

Re: Faire un ping sans exec, shell_exec ou system ?

Posté : 25 mars 2012 11:08
par Guillaume
Hello,

J'ai trouvé ça, j'ai pas eu le temps de regarder plus, bon courage, c'est facile : http://www.php.net/manual/fr/function.s ... .php#80775

Re: Faire un ping sans exec, shell_exec ou system ?

Posté : 25 mars 2012 11:17
par jeje3030
merci beaucoup, mais ce code demande d'avoir les droits administrateurs, sinon il a l'air de marcher car il ne bloque qu'a l'ouverture du socket(les paramètres ne sont pas les même quand j'utilise cette fonction habituellement, donc c'est surement un des paramètres qui nécessite d’être administrateur).
EDIT: je vient d'utiliser un autre code, même résultat opération non permises.
Ce code :

Code : Tout sélectionner

<?
$g_icmp_error = "No Error";

// timeout in ms

function icmpChecksum($data)
{
        $bit = unpack('n*', $data);
        $sum = array_sum($bit);

        if (strlen($data) % 2) {
                $temp = unpack('C*', $data[strlen($data) - 1]);
                $sum += $temp[1];
        }

        $sum = ($sum >> 16) + ($sum & 0xffff);
        $sum += ($sum >> 16);

        return pack('n*', ~$sum);
}

function getLastIcmpError()
{
        global $g_icmp_error;
        return $g_icmp_error;
}

function ping($host, $timeout = 3, $port = 0)
{
        
        $datasize = 64;
        global $g_icmp_error;
        $g_icmp_error = "No Error";
        $ident = array(ord('J'), ord('C'));
        $seq   = array(rand(0, 255), rand(0, 255));

     $packet = '';
     $packet .= chr(8); // type = 8 : request
     $packet .= chr(0); // code = 0

     $packet .= chr(0); // checksum init
     $packet .= chr(0); // checksum init

        $packet .= chr($ident[0]); // identifier
        $packet .= chr($ident[1]); // identifier

        $packet .= chr($seq[0]); // seq
        $packet .= chr($seq[1]); // seq

        for ($i = 0; $i < $datasize; $i++)
                $packet .= chr(0);

        $chk = icmpChecksum($packet);

        $packet[2] = $chk[0]; // checksum init
        $packet[3] = $chk[1]; // checksum init

        $sock = socket_create(AF_INET, SOCK_RAW, getprotobyname('icmp'));
        $time_start = microtime();
    socket_sendto($sock, $packet, strlen($packet), 0, $host, $port);
   

    $read   = array($sock);
        $write  = NULL;
        $except = NULL;

        $select = socket_select($read, $write, $except, 0, $timeout * 1000);
        if ($select === NULL)
        {
                $g_icmp_error = "Select Error";
                socket_close($sock);
                return -1;
        }
        elseif ($select === 0)
        {
                $g_icmp_error = "Timeout";
                socket_close($sock);
                return -1;
        }

    $recv = '';
    $time_stop = microtime();
    socket_recvfrom($sock, $recv, 65535, 0, $host, $port);
        $recv = unpack('C*', $recv);
       
        if ($recv[10] !== 1) // ICMP proto = 1
        {
                $g_icmp_error = "Not ICMP packet";
                socket_close($sock);
                return -1;
        }

        if ($recv[21] !== 0) // ICMP response = 0
        {
                $g_icmp_error = "Not ICMP response";
                socket_close($sock);
                return -1;
        }

        if ($ident[0] !== $recv[25] || $ident[1] !== $recv[26])
        {
                $g_icmp_error = "Bad identification number";
                socket_close($sock);
                return -1;
        }
       
        if ($seq[0] !== $recv[27] || $seq[1] !== $recv[28])
        {
                $g_icmp_error = "Bad sequence number";
                socket_close($sock);
                return -1;
        }

        $ms = ($time_stop - $time_start) * 1000;
       
        if ($ms < 0)
        {
                $g_icmp_error = "Response too long";
                $ms = -1;
        }

        socket_close($sock);

        return $ms;
}
?>
et celui ci :

Code : Tout sélectionner

<?
function ping($host) {
    $package = "\x08\x00\x19\x2f\x00\x00\x00\x00\x70\x69\x6e\x67";

    /* create the socket, the last '1' denotes ICMP */   
    $socket = socket_create(AF_INET, SOCK_RAW, 1);
   
    /* set socket receive timeout to 1 second */
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));
   
    /* connect to socket */
    socket_connect($socket, $host, null);
   
    /* record start time */
    list($start_usec, $start_sec) = explode(" ", microtime());
    $start_time = ((float) $start_usec + (float) $start_sec);
   
    socket_send($socket, $package, strlen($package), 0);
   
    if(@socket_read($socket, 255)) {
        list($end_usec, $end_sec) = explode(" ", microtime());
        $end_time = ((float) $end_usec + (float) $end_sec);
   
        $total_time = $end_time - $start_time;
       
        return $total_time;
    } else {
        return false;
    }
   
    socket_close($socket);
}

donne le même résultat, une erreur de permissions.

Re: Faire un ping sans exec, shell_exec ou system ?

Posté : 26 mars 2012 10:03
par jeje3030
personne n'a une idée ?

Re: Faire un ping sans exec, shell_exec ou system ?

Posté : 27 mars 2012 15:46
par jeje3030
Rebonjour,
je n'ai toujours pas trouvé de solution, j'ai réessayé les précédent codes ainsi que des nouveaux mais rien n'y fait :
:(
-Avec les sockets, impossible d'utiliser le protocole (souvent 'icmp' est utilisé dans les codes que j'ai trouvé ainsi que celui que Guillaume m'a montré au début du post). Résultat : Permission refusée.
Je précise que l'un des créateurs de ces codes (utilisant les sockets) dit : "on Unix System, you need to have the root acces to execute this function".
-avec system, exec, shell_exec : fonction désactivée !

Que puis-je faire ? Merci beaucoup ! :)