/usr/bin/ip2hostname is in flowscan 1.006-13.2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #! /usr/bin/perl
# ip2hostname - a filter to turn IP addresses into host names wherever possible.
# $Id: ip2hostname,v 1.8 2001/02/13 04:42:20 plonka Exp $
# Dave Plonka <plonka@doit.wisc.edu>
use FindBin;
use Socket;
use Getopt::Std;
sub usage {
   my $status = shift;
   print STDERR <<_EOF_
usage: $FindBin::Script [-h] [ -p printf_format ] [ [-i extension] file [...] ]
       -h - help (shows this usage information)
	    (mnemonic: 'h'elp)
       -p printf_format - use this printf format for IP address and hostname,
			  respectively.
			  The default format is '%.0s%s', which supresses
			  the printing of the IP address (i.e. "%.0s" specifies
			  printing a string with a maximum width of zero).
			  To maintain column widths (since both the IP address
			  and hostname vary in lenght), a format like this may
			  be useful:
			  '%-16.16s %-20s'
	    (mnemonic: 'p'rintf format)
       -i extension - edit the files in place (rather than sending to
		      standard output) This option requires file name(s)
		      argument(s).
		      The extension is added to the name of the old file
		      to make a backup copy.
		      If you don't wish to make a backup, use "-I".
	    (mnemonic: edit 'i'n place)
       -I - like "-i" but no backup is made.
	    (mnemonic: edit 'I'n place, trusting this script 'I'mplicitly. ;^)
_EOF_
   ;
   exit $status
}
getopts('hp:Ii:') || usage(2);
usage(0) if ($opt_h);
$| = 1;
my $oldargv;
my %cache;
while (<>) {
   # { this is straight from the "perlrun" man page:
   if ('-' ne $ARGV && ($opt_I || $opt_i) && $ARGV ne $oldargv) {
      if ('' eq $opt_i) {
	 unlink($ARGV) or die "unlink \"$ARGV\": $!\n"
      } else {
         rename($ARGV, $ARGV . $opt_i) or die "rename \"$ARGV\": $!\n"
      }
      open(ARGVOUT, ">$ARGV");
      select(ARGVOUT);
      $oldargv = $ARGV;
   }
   # }
   my $s = $_;
   my $prev = '';
   my($name, $val);
   while ($s =~ m/(\d+\.)\d+\.\d+\.\d+/) {
      my $ip = $&;
      $s =~ s/$1//;
      next if ($ip eq $prev);
      if (defined($cache{$ip})) {
         $name = $cache{$ip}
      } else {
         $name = gethostbyaddr(inet_aton($ip), AF_INET);
         $cache{$ip} = $name
      }
      if ('' eq $name) {
         $name = $ip
      }
      if ($opt_p) {
         $val = sprintf($opt_p, $ip, $name)
      } else {
         $val = $name
      }
      s/$ip/$val/g;
      $prev = $ip
   }
   print
}
 |