Faire un ping sans exec, shell_exec ou system ?

Pour parler de tout ce qui concerne l'hébergement web, c'est ici.
Répondre
jeje3030
Messages : 6
Enregistré le : 20 juil. 2011 10:29
Compte LegTux : jeje3030

Faire un ping sans exec, shell_exec ou system ?

Message 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-
Avatar du membre
Guillaume
Administrateur
Messages : 703
Enregistré le : 04 sept. 2010 12:50
Compte LegTux : rguillaume
Localisation : Montluçon

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

Message 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
jeje3030
Messages : 6
Enregistré le : 20 juil. 2011 10:29
Compte LegTux : jeje3030

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

Message 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.
jeje3030
Messages : 6
Enregistré le : 20 juil. 2011 10:29
Compte LegTux : jeje3030

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

Message par jeje3030 »

personne n'a une idée ?
jeje3030
Messages : 6
Enregistré le : 20 juil. 2011 10:29
Compte LegTux : jeje3030

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

Message 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 ! :)
Répondre