FTP-приложение, написанное на Perl, не подключается - PullRequest
1 голос
/ 17 октября 2011

Почему моя программа не работает? Он отказывается подключаться к хосту, я пробовал два разных сервера и проверил, какой порт используется. Обратите внимание, что я не очень опытен, когда дело доходит до Perl.

use strict;
use Net::FTP;
use warnings;

my $num_args = $#ARGV+1;
my $filename;
my $port;
my $host;
my $ftp;



if($num_args < 2)
{
    print "Usage: ftp.pl host [port] file\n";
    exit();
}
elsif($num_args == 3)
{
    $port = $ARGV[1];
    $host = $ARGV[0];
    $filename = $ARGV[2];
    print "Connecting to $host on port $port.\n";
    $ftp = Net::FTP->new($host, Port => $port, Timeout => 30, Debug => 1)
       or die "Can't open $host on port $port.\n";
}
else
{
    $host = $ARGV[0];
    $filename = $ARGV[1];
    print "Connecting to $host with the default port.\n";
    $ftp = Net::FTP->new($host, Timeout => 30, Debug => 1)
       or die "Can't open $host on port $port.\n";
}

print "Usename: ";
my $username = <>;
print "\nPassword: ";
my $password = <>;

$ftp->login($username, $password);
$ftp->put($filename) or die "Can't upload $filename.\n";

print "Done!\n";

$ftp->quit;

Заранее спасибо.

1 Ответ

2 голосов
/ 17 октября 2011

Теперь, когда у вас уже есть ответ <> -> <STDIN>, я думаю, что вижу проблему.Когда @ARGV содержит что-либо, <> является «магическим открытием».Perl интерпретирует следующий элемент в @ARGV как имя файла, открывает его и читает его построчно.Поэтому, я думаю, вы, вероятно, можете сделать что-то вроде:

use strict;
use Net::FTP;
use warnings;

use Scalar::Util 'looks_like_number';

if(@ARGV < 2)
{
    print "Usage: ftp.pl host [port] file [credentials file]\n";
    exit();
}

my $host = shift; # or equiv shift @ARGV;
my $port = (looks_like_number $ARGV[0]) ? shift : 0;
my $filename = shift;

my @ftp_args = (
  $host,
  Timeout => 30,
  Debug => 1
);

if ($port)
}
    print "Connecting to $host on port $port.\n";
    push @ftp_args, (Port => $port);
}
else
{
    print "Connecting to $host with the default port.\n";
}
my $ftp = Net::FTP->new(@ftp_args)
     or die "Can't open $host on port $port.\n";

#now if @ARGV is empty reads STDIN, if not opens file named in current $ARGV[0] 

print "Usename: ";
chomp(my $username = <>); #reads line 1 of file
print "\nPassword: ";
chomp(my $password = <>); #reads line 2 of file

$ftp->login($username, $password);
$ftp->put($filename) or die "Can't upload $filename.\n";

print "Done!\n";

$ftp->quit;

Тогда, если у вас есть несколько кредитных карт в файле (скажем, с именем cred), таких как

myname
mypass

затем

$ ftp.pl host 8020 file cred

откроет host: 8020 для файла, использующего учетные данные в кредите.

Я не уверен, что вы хотите это сделать, просто так ТАК работает <>.

...