2012-12-17 129 views
0

我試圖通過ftp到服務器,一旦我在那裏,我希望得到一個文件服務器,然後把它睡了5分鐘後回來。我有這個部分是正確的,但我添加到代碼中,兩個變量將在代碼執行時輸入。用戶將輸入他們想要連接的用戶名。雖然我有問題連接。當我輸入用戶名t14pb,它還是到第一if語句,因爲如果我說t14pmds。這裏是代碼:FTP爲使用特定的用戶名

#!/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: $!"; 
} 
+2

請'使用嚴格的;使用警告「。該會指出一些錯誤(如忘記引號,或者不使用'eq'字符串對比,或者在數字comparisions使用字符串,或者未聲明的變量)。 – amon

回答

5

Perl標量有兩種:stringy和numeric。您使用==測試數值是否相等。如果字符串看起來不像數字,則它們被認爲等於零。這就是爲什麼第一個分支總是執行(0 == 0)的原因。

您可以使用eq進行與stringy等效的測試,因此您想要比較如if ($username eq "foo") {...}

然而,如果-brances代碼不會改變,所以你可以向外移動的通用代碼。剩下的就是用戶名和密碼之間的映射 - 東西哈希是良好的:

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在你的腳本的頂部。這會指出大多數的錯誤(如忘記引號,或者不使用情商字符串對比,或者在數字comparisions使用字符串,或者未聲明的變量)。

+0

非常感謝! – user1854765

2

正是在程序,你寫use strictuse warnings尤爲重要,並宣佈採用my接近其使用的第一poiint變量。

你的整個程序是最好這樣寫的,使用哈希查找表查找每個用戶的密碼。

#!/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"; 
相關問題