note
George_Sherston
I tried increasing the debug level as you suggest, and it leaves me more baffled, but in a more specific way. First, I boiled down the script to the absolute minimum necessary to recreate the problem. It's now:
<code>
#!/usr/bin/perl -w
use strict;
use Net::FTP;
#use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
my $ftp = Net::FTP->new("ftp.xxxxx.xxx");
$ftp->pasv;
$ftp->login('xxx','xxx');
my @files = $ftp->ls('/tst') or die "could not do ls";
print "Content-Type: text/html\n\n";
print "$_\n" for @files;
print "done\n";
</code>
Now, it still works fine when run from the command line, and fails when run from the browser. When it fails in the browser I just get an internal server error, because I deleted CGI::Carp, but reviewing the error logs shows the following (n.b. I tried this with a different ftp server too, so I really think that the problem is here):
<h2>Output from the script when run from the COMMAND LINE</h2>
<code>
Net::FTP: Net::FTP(2.61)
Net::FTP: Exporter(5.562)
Net::FTP: Net::Cmd(2.20)
Net::FTP: IO::Socket::INET(1.25)
Net::FTP: IO::Socket(1.26)
Net::FTP: IO::Handle(1.21)
Net::FTP=GLOB(0x81177a8)<<< 220 xxxxxxxx.xxx ULTRA FTP SERVER
Net::FTP=GLOB(0x81177a8)>>> PASV
Net::FTP=GLOB(0x81177a8)<<< 530 Please login with USER and PASS.
Net::FTP=GLOB(0x81177a8)>>> user xxx
Net::FTP=GLOB(0x81177a8)<<< 331 Password required for xxx.
Net::FTP=GLOB(0x81177a8)>>> PASS ....
Net::FTP=GLOB(0x81177a8)<<< 230 CyBo welcomes replicant xxx.
Net::FTP=GLOB(0x81177a8)>>> PASV
Net::FTP=GLOB(0x81177a8)<<< 227 Entering Passive Mode (XXX,XX,XXX,XXX,XXX,XXX).
Net::FTP=GLOB(0x81177a8)>>> NLST /tst
Net::FTP=GLOB(0x81177a8)<<< 150 Opening ASCII mode data connection for file list
Net::FTP=GLOB(0x81177a8)<<< 226 Transfer complete.
Content-Type: text/html
/tst/graphics
/tst/style
/tst/images
done
Net::FTP=GLOB(0x81177a8)>>> QUIT
Net::FTP=GLOB(0x81177a8)<<< 221 Goodbye.
</code>
<h2>Error Log report when run from the WEB BROWSER</h2>
<code>
Net::FTP: Net::FTP(2.61)
Net::FTP: Exporter(5.562)
Net::FTP: Net::Cmd(2.20)
Net::FTP: IO::Socket::INET(1.25)
Net::FTP: IO::Socket(1.26)
Net::FTP: IO::Handle(1.21)
Net::FTP=GLOB(0x8286474)<<< 220 xxxxx.xxx ULTRA FTP SERVER
Net::FTP=GLOB(0x8286474)>>> PASV
Net::FTP=GLOB(0x8286474)<<< 530 Please login with USER and PASS.
Net::FTP=GLOB(0x8286474)>>> user xxx
Net::FTP=GLOB(0x8286474)<<< 331 Password required for xxx.
Net::FTP=GLOB(0x8286474)>>> PASS ....
Net::FTP=GLOB(0x8286474)<<< 230 CyBo welcomes replicant xxx.
Net::FTP=GLOB(0x8286474)>>> PORT XXX,XX,XXX,XXX,XXX,XXX
Net::FTP=GLOB(0x8286474)<<< 200 PORT command successful.
Net::FTP=GLOB(0x8286474)>>> NLST /tst
Net::FTP=GLOB(0x8286474)<<< 425 Can't build data connection: Connection refused
could not do ls at ftp.pl line 9.
Net::FTP=GLOB(0x8286474)>>> QUIT
Net::FTP=GLOB(0x8286474)<<< 221 Goodbye.
</code>
So... it seems that what's happening is that when run from the browser the script doesn't go into passive mode (whatever that means)... but I thought it already was in passive mode. I'm completely out of my depth here, and I would be most grateful for a steer on how to get this to work.
<br><br>§ <A HREF="http://www.sprogress.com">George Sherston</A>
181428
181434