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:
#!/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";
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):
Output from the script when run from the COMMAND LINE
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.
Error Log report when run from the WEB BROWSER
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: Connectio
+n refused
could not do ls at ftp.pl line 9.
Net::FTP=GLOB(0x8286474)>>> QUIT
Net::FTP=GLOB(0x8286474)<<< 221 Goodbye.
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.
§
George Sherston
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.