我正在尝试ftp进入服务器,一旦我在那里,我想得到一个文件,然后在睡了5分钟后把它放回去。我有那个部分是正确的,但我在代码中添加了两个在执行代码时输入的变量。用户将输入他们想要连接的用户名。我虽然连接有问题。当我输入用户名t14pb时,它仍然会转到第一个if语句,就像我说t14pmds一样。这是代码:
#!/usr/bin/perl
use Net::FTP;
$host = "fd00p02";
$username = "$ARGV[0]";
$ftpdir = "/";
$file = "$ARGV[1]";
print "$username\n";
print "$file\n";
if ($username == t14pmds) {
$password = "test1";
$ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
$ftp->login($username, $password) or die "Login failed: $!";
$ftp->cwd($ftpdir) or die "Can't go to $ftpdir: $!";
$ftp->get($file) or die "Can't get $file: $!";
sleep 5;
$ftp->put($file) or die "Can't put $file: $!";
$ftp->quit or die "Error closing ftp connection: $!";
}
if ($username == t14pb) {
$password = "test2";
$ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
$ftp->login($username, $password) or die "Login failed: $!";
$ftp->cwd($ftpdir) or die "Can't go to $ftpdir: $!";
$ftp->get($file) or die "Can't get $file: $!";
sleep 5;
$ftp->put($file) or die "Can't put $file: $!";
$ftp->quit or die "Error closing ftp connection: $!";
}
if ($username == t14pmds_out) {
$password = "test3";
$ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
$ftp->login($username, $password) or die "Login failed: $!";
$ftp->cwd($ftpdir) or die "Can't go to $ftpdir: $!";
$ftp->get($file) or die "Can't get $file: $!";
sleep 5;
$ftp->put($file) or die "Can't put $file: $!";
$ftp->quit or die "Error closing ftp connection: $!";
}
if ($username == t14fiserv) {
$password = "test4";
$ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
$ftp->login($username, $password) or die "Login failed: $!";
$ftp->cwd($ftpdir) or die "Can't go to $ftpdir: $!";
$ftp->get($file) or die "Can't get $file: $!";
sleep 5;
$ftp->put($file) or die "Can't put $file: $!";
$ftp->quit or die "Error closing ftp connection: $!";
}
答案 0 :(得分:5)
Perl标量有两种形式:stringy和numeric。您使用==
测试数字相等性。字符串被认为等于零,如果它们看起来不像数字。这就是第一个分支始终执行的原因(0 == 0)。
您使用eq
测试字符串等效性,因此您想要比较if ($username eq "foo") {...}
。
但是,if-brances中的代码不会更改,因此您可以将公共代码移到外面。剩下的是用户名和密码之间的映射 - hash 适用于:
my %uname_2_passwd = (
t14pmds => "test1", # LHS of "=>" is auto-quoted,
... # if it would be a valid variable name.
);
my $password = $uname_2_passwd{$username};
# common code here
另外,请在脚本顶部use strict; use warnings
。这可能会指出大多数错误(例如忘记引号,或者不使用eq进行字符串比较,或者在数字比较中使用字符串,或者不声明变量)。
答案 1 :(得分:2)
对于您编写的每个程序中的use strict
和use warnings
尤为重要,并使用接近其第一个使用点的my
声明变量。< / p>
您的整个程序最好这样编写,使用哈希作为查找表来查找每个用户的密码。
#!/usr/bin/perl
use strict;
use warnings;
use Net::FTP;
my ($username, $file) = @ARGV;
my %passwords = (
t14pmds => 'test1',
t14pb => 'test2',
t14pmds_out => 'test3',
t14fiserv => 'test4',
);
my $password = $passwords{$username} or die qq<Unknown username "$username">;
print "User: $username\n";
print "Pass: $file\n";
my $host = 'fd00p02';
my $ftpdir = '/';
my $ftp = Net::FTP->new($host) or die "Error connecting to $host: $!";
$ftp->login($username, $password) or die "Login failed: $!";
$ftp->cwd($ftpdir) or die "Can't go to $ftpdir: $!";
$ftp->get($file) or die "Can't get $file: $!";
sleep 5;
$ftp->put($file) or die "Can't put $file: $!";
$ftp->quit or die "Error closing ftp connection: $!";
print "All phases successful\n";