2012-12-17 2 views
0

일단 서버에 FTP를 연결하려고하면 파일을 가져 와서 5 분 동안 다시 잠자기 모드로 설정합니다. 그 부분은 정확하지만 코드를 추가 할 때 코드가 실행될 때 입력되는 두 개의 변수가 추가되었습니다. 사용자는 연결할 사용자 이름을 입력합니다. 그래도 연결하는 데 문제가 있습니다. 사용자 이름 t14pb를 입력 할 때, 마치 t14pmds와 마찬가지로 첫 번째 if 문으로 이동합니다. 코드는 다음과 같습니다.특정 사용자 이름을 사용하여 서버에 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

'use strict; 경고를 사용합니다 .'. 이것은 인용 부호를 잊어 버리거나, 문자열 비교를 위해'eq'를 사용하지 않거나, 수치 비교에서 문자열을 사용하거나, 변수를 선언하지 않는 것과 같은 몇 가지 실수를 지적 할 것입니다. – amon

답변

5

Perl 스칼라는 stringy와 numeric의 두 가지 유형으로 나뉩니다. ==으로 숫자가 같음을 테스트합니다. 문자열이 숫자처럼 보이지 않으면 문자열은 0과 같은 것으로 간주됩니다. 이것이 첫 번째 분기가 항상 실행되는 이유입니다 (0 == 0).

eq으로 문자열 동치를 테스트하므로 if ($username eq "foo") {...}과 비교할 수 있습니다.

그러나 if-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 스크립트의 상단에. 이것은 대부분의 실수 (따옴표를 잊어 버리거나 문자열 비교를 위해 eq를 사용하지 않거나 숫자 비교에서 문자열을 사용하거나 변수를 선언하지 않음)를 지적했을 것입니다.

+0

대단히 감사합니다! – user1854765

2

그것은 당신이 쓰는 모든 프로그램 use strictuse warnings 특히 중요하며, 사용의 첫 poiint에 my 가까운를 사용하여 변수를 선언합니다.

전체 프로그램은 해시 테이블을 조회 테이블로 사용하여 각 사용자의 암호를 찾는 것이 가장 좋습니다.

#!/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"; 
관련 문제