use IO::Socket; ... ... $sender = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"ftp.xxx.com", PeerPort=>"ftp(21)", Timeout=>10) || return(0); $receiver = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"ftp.yyy.com", PeerPort=>"ftp(21)", Timeout=>10) || return(0); ... ... sub ftpGrab { ## Login to remote sender. until (<$sender> =~ m/220/) {print;} print $sender "USER xxx\r\n"; $reply = <$sender>; return(0) if ($reply !~ m/331/); print $sender "PASS xxx\r\n"; $reply = <$sender>; return(0) if ($reply !~ m/230/); ## Login to receiver. until (<$receiver> =~ m/220/) {print;} print $receiver "USER yyy\r\n"; $reply = <$receiver>; return(0) if ($reply !~ m/331/); print $receiver "PASS yyy\r\n"; $reply = <$receiver>; return(0) if ($reply !~ m/230/); return(0) if (!grabData("xxx", "yyy")); ## Close socket connections. close($sender); close($receiver); return(1); } sub grabData { ## Declare local variables. my $port; my $rest; ## Open passive port on receiver and store port. print $receiver "PASV\r\n"; $reply = <$receiver>; return(0) if ($reply !~ m/227/); ($rest, $port, $rest) = split(/[()]/, $reply); ## Open data port on remote sender. print $sender "PORT $port\r\n"; $reply = <$sender>; return(0) if ($reply !~ m/200/); ## Change data transfer type to ASCII on remote sender. print $sender "TYPE A\r\n"; $reply = <$sender>; return(0) if ($reply !~ m/200/); ## Send file from remote sender. print $sender "RETR $_[0]\r\n"; $reply = <$sender>; return(0) if ($reply !~ m/150/); ## Store file on receiver. print $receiver "STOR $_[1]\r\n"; $reply = <$receiver>; return(0) if ($reply !~ m/150/); $reply = <$sender>; return(0) if ($reply !~ m/226/); $reply = <$receiver>; return(0) if ($reply !~ m/226/); print "File $_[0] Transferred!\n"; return(1); }