2010-06-28 12 views

Antwort

1

liegt vor, wenn sich die Datei im FTP-Bereich auf dem Remote-Server ist, dann Net verwenden :: FTP. Holen Sie sich eine ls Liste des Verzeichnisses und sehen Sie, ob Ihre Datei dort ist.

Aber Sie können nicht einfach gehen und sehen, ob eine beliebige Datei auf dem Server ist. Überlegen Sie, was für ein Sicherheitsproblem das wäre.

6

Sie am besten mit SSH könnte bedient werden, dies zu tun:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $ssh = "/usr/bin/ssh"; 
my $host = "localhost"; 
my $test = "/usr/bin/test"; 
my $file = shift; 

system $ssh, $host, $test, "-e", $file; 
my $rc = $? >> 8; 
if ($rc) { 
    print "file $file doesn't exist on $host\n"; 
} else { 
    print "file $file exists on $host\n"; 
} 
+0

aber was zu tun ist, wenn es ein Remote-Server ist, der passwortgeschützt ist? – Jithin

+0

@Jithin Das sind die ssh-Schlüssel. –

+0

Ja, ich habe es. Gibt es jedoch eine Problemumgehung im Skript, wenn der Remote-Server passwortgeschützt ist? – Jithin

1

Melden Sie sich bei dem FTP-Server, und sehen, ob Sie einen FTP-SIZE auf die Datei erhalten können Sie interessieren:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use Net::FTP; 
use URI; 

# ftp_file_exists('ftp://host/path') 
# 
# Return true if FTP URI points to an accessible, plain file. 
# (May die on error, return false on inaccessible files, doesn't handle 
# directories, and has hardcoded credentials.) 
# 
sub ftp_file_exists { 
    my $uri = URI->new(shift); # Parse ftp:// into URI object 

    my $ftp = Net::FTP->new($uri->host) or die "Connection error($uri): [email protected]"; 
    $ftp->login('anonymous', '[email protected]') or die "Login error", $ftp->message; 
    my $exists = defined $ftp->size($uri->path); 
    $ftp->quit; 

    return $exists; 
} 

for my $uri (@ARGV) { 
    print "$uri: ", (ftp_file_exists($uri) ? "yes" : "no"), "\n"; 
} 
+0

Funktioniert das mit einer Datei der Größe Null? – Schwern

+0

@Swwern, danke und "nein", aber der überarbeitete Code wird es. – pilcrow

4

Sie einen Befehl wie verwenden:

use Net::FTP; 
$ftp->new(url); 
$ftp->login(usr,pass); 

$directoryToCheck = "foo"; 

unless ($ftp->cwd($directoryToCheck)) 
{ 
    print "Directory doesn't exist 
} 
0

Sie könnten verwenden ein Skript erwarten für den gleichen Zweck (benötigt keine zusätzlichen Module). Das Expect führt "ls -l" auf dem FTP-Server aus und das Perl-Skript parst die Ausgabe und entscheidet, ob die Datei existiert. Es ist wirklich einfach zu implementieren.

Hier ist der Code,

PERL-Skript: (main.pl)

# ftpLog variable stores output of the expect script which logs in to FTP server and runs "ls -l" command 
$fileName = "myFile.txt"; 
$ftpLog = `/usr/local/bin/expect /path/to/expect_script/ftp_chk.exp $ftpIP $ftpUser $ftpPass $ftpPath`; 

# verify that file exists on FTP server by looking for filename in "ls -l" output 
if(index($ftpLog,$fileName) > -1) 
{ 
    print "File exists!"; 
} 
else 
{ 
    print "File does not exist."; 
} 

Skript ERWARTEN: (ftp_chk.exp)

#!/usr/bin/expect -f 

set force_conservative 0; 
set timeout 30 
set ftpIP [lindex $argv 0] 
set ftpUser [lindex $argv 1] 
set ftpPass [lindex $argv 2] 
set ftpPath [lindex $argv 3] 

spawn ftp $ftpIP 

expect "Name (" 
send "$ftpUser\r" 

sleep 2 

expect { 
"assword:" { 
    send "$ftpPass\r" 
    sleep 2 

    expect "ftp>" 
    send "cd $ftpPath\r\n" 
    sleep 2 

    expect "ftp>" 
    send "ls -l\r\n" 
    sleep 2 

    exit 
    } 
"yes/no)?" { 
    send "yes\r" 
    sleep 2 
    exp_continue 
    } 
timeout { 
    puts "\nError: ftp timed out.\n" 
    exit 
    } 
} 

ich dieses Setup verwendet haben, in einem der meine Werkzeuge und ich kann garantieren, dass es perfekt funktioniert :)

Verwandte Themen