Question

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'?

Was it helpful?

Solution

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.

OTHER TIPS

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

Or you can set SUID bit on "ping" program on unix ;)

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.

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top