2013-07-29 4 views
0

Я пытаюсь передать все каталоги и его содержимое с sftp на unix-сервер и удалить все переданные файлы с SFTP-сервера. Для этого я использую метод rget в SFTP :: Foreign. Но когда я запускаю код ниже, я продолжаю получать ошибку. Пожалуйста помоги.Перенос каталогов с использованием внешнего модуля sftp в Perl

use Net::SFTP::Foreign; 

use constant { 
    HOST  => "Host name", 
    REMOTE_DIR => "sample/remote", 
    LOCAL_DIR => "sample/local", 
    USER_NAME => "username", 
    PASSWORD => "password", 
    DEBUG  => "0", 
}; 

my $sftp; 
$sftp = Net::SFTP::Foreign->new(
    HOST, 
    timeout => 240, 
    user  => USER_NAME, 
    password => PASSWORD, 
    autodie => 1, 
) or die "Connection failed: " . $sftp->error; 

$sftp->setcwd(REMOTE_DIR); 
my @files = @{ $sftp->ls }; #Returns a reference to an array of hashes 

for my $file (@files) { 
    print "Found file $file->{filename}\n"; 

    $sftp->rget($file, $file, on_error => sub { print $sftp->error; }); 
    print "File - $file transferred\n"; 

    # Delete Files 
    $sftp->rremove($file, on_error => sub { print $sftp->error; }); 
    print "Deleted File -$file\n"; 
} 

Когда я запускаю вышеуказанный код, я получаю ошибку, как показано ниже.

Couldn't stat remote link: No such file 

Но когда я перехожу в удаленное местоположение, каталоги присутствуют.

Но когда я пытаюсь использовать цикл for, используя приведенный ниже код, он работает нормально.

$sftp->rget(REMOTE_DIR, LOCAL_DIR, on_error => 
     sub { print $sftp->error; }) ; 

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

ответ

0

ls() возвращает массив hashrefs. Вы хотите получить/удалить $file->{filename}, а не $file.

Смежные вопросы