2015-07-28 4 views
0

Я являюсь 1 однодневный на Perl, проходили через API doc here, есть несколько основных вопросовPerl SFTP: как проверить удаленный файл оленьей кожи существовать

$sftp = Net::SFTP::Foreign->new($host, autodie => 1); 
    my $ls = $sftp->ls("/bar"); 
    # dies as: "Couldn't open remote dir '/bar': No such file" 

Вопрос

  • с autodie выйдет соединение будет автоматически закрыто?
  • Мы видим в приведенном выше примере, как использовать папку, аналогичный синтаксис также работает для файла?

Или что-то в этом смысле имеет смысл?

my $sftp = Net::SFTP::Foreign->new($host, autodie => 1); 
    $sftp->find("/sdfjkalshfl", # nonexistent directory 
       on_error => sub { print "foo!\n";sftp->disconnect();exit; }); 

Я пытался запустить следующий код на моем окна машины

use Net::SFTP::Foreign; 
my $host = "demo.wftpserver.com"; 
my $sftp = Net::SFTP::Foreign->new($host ,ssh_cmd => 'plink',autodie => 1); 
my $ls = $sftp->ls("/bar"); 

Но я получаю ошибку

«палить» не распознается как внутренней или внешней командой,

Однако, когда я запустил plink из командной строки Windows, он отлично работает !!

ответ

2

с autodie будет ли автоматическое закрытие соединения?

Да. Когда программа заканчивается, все уничтожается и соединения закрываются. Это также имеет место, когда переменная $sftp выходит за рамки. Такие модули обычно реализуют a DESTROY sub. Они вызывается, когда объект (который является только ссылкой в ​​Perl) выходит за рамки. В этом разделе может быть какая-то очистка. Другим примером является DBI и, конечно, лексические дескрипторы файлов (например, $fh от вызова open).

Мы видим в приведенном выше примере, как использовать папку, аналогичный синтаксис также работает для файла?

No.The docs говорят ls для каталога:

Выдает список удаленного каталога $ дистанционного управления. Если $ remote не указан, отображается текущий удаленный рабочий каталог.

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

my $ls = $sftp->ls('/home/foo', wanted => qr/^filename.txt$/); 

Хотя с autodie, который должен умереть, так что если вы не хотите, чтобы он на самом деле умереть здесь, вы должны обернуть его в Try::Tiny вызова или eval.

use Try::Tiny 

# ... 

my $ls = try { 
    return $sftp->ls('/home/foo', wanted => qr/^filename.txt$/); 
} catch { 
    return; # will return undef 
}; 

say 'Found file "filename.txt" on remote server' if $ls; 

Как plink быть не найден, вероятно, для Windows PATH отличается от того, что видит ваш Perl.

+0

Большое спасибо за ваш быстрый ответ (1) за plink Я использую Padre Perl IDE, не уверен, что установка PATH отличается для Windows & Padre ... можете ли вы, пожалуйста, посоветуть (2), можно найти для проверки файла имя или только ls могут использоваться – Lav

+1

2) Документы говорят, что поиск выполняется рекурсивно. Думаю, это сработает. Почему бы вам не попробовать. 1) У меня нет опыта работы с Padre, и у меня нет машины Windows, доступной для тестирования. Попробуйте предоставить полный абсолютный путь. – simbabque

+0

my $ sftp = Net :: SFTP :: Foreign-> new ($ host, ssh_cmd => 'C: /plink/plink-1.07-dos/plink',autodie => 1); или my $ sftp = Net :: SFTP :: Foreign-> new ($ host, ssh_cmd => C: \ plink \ plink-1.07-dos \ plink ', autodie => 1); .... выше строки дает мне плохое удаленное сообщение, полученное на test.pl – Lav

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