views:

272

answers:

4

I'm on a Linux system where I am not allowed to use the 'ping' application (ping: icmp open socket: Operation not permitted). However, the script that I am writing (PHP, but I can use an exec() call to any script/program if needed) needs to determine if a host is 'alive'. How can I go about this without using 'ping'?

A: 

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

But if you can't open a socket with ping, it's unlikely that you can use any of these. Talk to your hosting provider.

David Seiler
A: 

The PHP Manual gives user supplied code for an implementation of a ping in PHP. Unfortunately, it requires root access so it's not likely you'll be able to use that either. One alternative is to use curl and look at the values returned by curl_getinfo():

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

It is nowhere near being equivalent to ping, but still maybe suitable for your needs.

Andrew Austin
+2  A: 

If ping can't do it, you can't do it in a different language. Here is an analogy that may help you understand why. Let's say there is a file on the file system and you want to its contents. You run cat filename and it says cat: filename: Permission denied. Do you think Perl (or any other language) will fair better than C did here? Let's try:

#!/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>;

When run against the file it says could not open filename: Permission denied. No matter what language you try to use, you are going to get Operation not permitted.

That said, there are other methods of determining if a machine is alive. If there is a server that is known to always be running on the machine, you could try to connect to it. Note that you don't need to finish the connection (e.g. log in), just the fact that you can successfully initiate the connection is enough to know that box is up.

Chas. Owens
+1  A: 

To do a ping (ICMP) you need root access.

The only way you have is to do a TCP or UDP ping. If you want an example check the code of Cacti or you can use hping to do it for you

Yoann Le Touche