www.pudn.com > ftpcheck.zip > ftpcheck.pl


#!/usr/bin/perl 
# 
# http://www.cotse.com  Fear the swimming Elephant! 
# 
######################################################## 
# ftpcheck v0.31                      [November 2, 1998]  
#          http://david.weekly.org/code 
# 
# by David Weekly  
# 
# Thanks to Shane Kerr for cleaning up the process code! 
# 
# This code is under the GPL. Use it freely. Enjoy. 
#        Debug. Enhance. Email me the patches! 
######################################################## 
 
use Socket; 
use Net::FTP; 
 
# timeouts in seconds for creating a socket and connecting 
my $MAX_SOCKET_TIME = 2; 
my $MAX_CONNECT_TIME = 3; 
 
my $HELP=qq{Usage: ftpcheck [-h | --help] [-p processes] [-d | --debug] host}; 
 
 
my @hosts; 
 
# how many simultaneous processes are we allowed to use? 
my $MAX_PROCESSES=10; 
my $DEBUG=0; 
 
while($_=shift){ 
    if(/^--(.*)/){ 
	$_=$1; 
	if(/help/){ 
	    print $HELP; 
	    exit(0); 
	} 
	if(/debug/){ 
	    $DEBUG=1; 
	} 
    }     
    elsif(/^-(.*)/){ 
	$_=$1; 
	if(/^h/ or /^\?/){	     
	    print $HELP; 
	    exit(0); 
	} 
	if(/^p/){ 
	    $MAX_PROCESSES=shift; 
	} 
	if(/^d/){ 
	    $DEBUG=1; 
	} 
    }else{ 
	push @hosts,$_; 
    } 
} 
 
if(!$hosts[0]){ 
    print $HELP; 
    exit(-1); 
} 
 
my $host; 
$|=1; 
print "ftpcheck v0.31 by dave weekly \n\n"; 
 
 
# go through all of the hosts, replacing subnets with all contained IPs. 
for $host (@hosts){ 
    $_=shift(@hosts); 
 
    # scan a class C 
    if(/^([^.]+)\.([^.]+)\.([^.]+)$/){ 
	my $i; 
	print "Expanding class C $_\n" if($DEBUG); 
	for($i=1;$i<255;$i++){ 
	    my $thost="$_.$i"; 
	    push @hosts,$thost; 
	} 
    } 
    else{ 
	push @hosts,$_; 
    } 
} 
 
my @pids; 
my $npids=0; 
 
for $host (@hosts){ 
    my $pid; 
    $pid=fork(); 
    if($pid>0){ 
	$npids++; 
	if($npids>=$MAX_PROCESSES){ 
	    for(1..($MAX_PROCESSES)){ 
		$wait_ret=wait(); 
		if($wait_ret>0){ 
		    $npids--; 
		} 
	    } 
	} 
	next; 
    }elsif(undef $pid){ 
	print "fork error\n" if ($DEBUG); 
	exit(0); 
    }else{ 
	my($proto,$port,$sin,$ip); 
	print "Trying $host\n" if ($DEBUG); 
	$0="(checking $host)"; 
 
	# kill thread on timeout 
	local $SIG{'ALRM'} = sub { exit(0); }; 
 
	alarm $MAX_SOCKET_TIME; 
	$proto=getprotobyname('tcp'); 
	$port=21; 
	$ip=inet_aton($host); 
	if(!$ip){ 
	    print "couldn't find host $host\n" if($DEBUG); 
	    exit(0); 
	} 
	$sin=sockaddr_in($port,$ip); 
	socket(Sock, PF_INET, SOCK_STREAM, $proto); 
 
	alarm $MAX_CONNECT_TIME; 
	if(!connect(Sock,$sin)){ 
	    exit(0); 
	} 
	my $iaddr=(unpack_sockaddr_in(getpeername(Sock)))[1]; 
	close(Sock);        
	 
	# SOMETHING is listening on the FTP port...really ftp server? 
	 
	print "listen $host!\n" if($DEBUG); 
	alarm 0; 
	$hostname=gethostbyaddr($iaddr,AF_INET); 
 
	# create new FTP connection w/5 second timeout 
	$ftp = Net::FTP->new($host, Timeout =>  5); 
	if(!$ftp){ 
	    print "      <$host ($hostname) denied you>\n" if($DEBUG); 
	    exit(0); 
	} 
	if(!$ftp->login("anonymous","just\@checking.com")){ 
	    print "   FTP on $host [$hostname]\n"; 
	    exit(0); 
	} 
 
	print "Anon FTP on $host [$hostname]\n"; 
 
	$ftp->quit; 
	exit(0); 
    } 
} 
 
print "done spawning, $npids children remain\n" if($DEBUG); 
 
# wait for my children 
for(1..$npids){ 
    my $wt=wait(); 
    if($wt==-1){ 
	print "hey $!\n" if($DEBUG); 
	redo; 
    } 
} 
 
print "Done\n";