0

私の要件は、ファイルとフォルダーを SFTP リモートの場所から UNIX の場所に転送することです。私は perl とシェル スクリプトを初めて使用するので、非常に混乱しています。以下に示すように、sftp 外部から rget コマンドを使用してみました。しかし、それは機能せず、転送されません。ファイルとフォルダーを sftp サーバーからコピーした後、それらを削除するにはどうすればよいですか?

use Net::SFTP::Foreign;

my $host       = "sftp.elsevier.com";
my $remote_dir = "sample/host";
my $localdir = "sample/local";
my $username   = "username";
my $password   = "password";
my $debug      = 0;

$sftp = Net::SFTP::Foreign->new($host, timeout => 240,user => $username, password => $password) or $newerr = 1;
push @ERRORS, "Can't sftp to $host: $!\n" if $newerr;
myerr() if $newerr;
print "Connected to $host\n";

$sftp->rget($remote_dir, $localdir) or $newerr = 1;
push @ERRORS, "Cant tranfer\n" if $newerr;
myerr() if $newerr;
$sftp->disconnect if $newerr;
print "Files are transferred successfully\n";

#Deleting files

$sftp->setcwd($remote_dir) or $newerr = 1;
push @ERRORS, "Can't cd $!\n" if $newerr;
myerr()    if $newerr;
$sftp->disconnect if $newerr;

my $files = $sftp->ls or $newerr = 1;
push @ERRORS, "Can't get file list $!\n" if $newerr;
myerr() if $newerr;

foreach (@$files){
$sftp->remove($_) or $newerr = 1;
push @ERRORS, "Cant delete\n" if $newerr;
myerr() if $newerr;

print "Deleted files successfully\n";

#}
$sftp->disconnect;

sub myerr {
    print "Error: \n";
    print @ERRORS;
    exit 0;
}

SFTP の場所 (サンプル/ホスト) 内には、ローカルの UNIX サーバー (サンプル/ローカル) にコピーし、リモートの場所から削除する必要がある多くのフォルダーとファイルがあります。

4

1 に答える 1

7

より現代的なスタイルで Perl をコーディングする方法を学ぶのに役立つ優れた Perl の本を入手する必要があります。Perl を学ぶことをお勧めします。これは、コーディングのテクニックを教えてくれるはずです。

たとえば、常に と を使用use strict;use warnings;ます。これら 2 つのモジュールは、すべてのコーディング エラーの約 99% をキャッチします。

また、エラー チェックを行う標準的な方法は、or dieスタイル構文を使用することです。これは、変数を設定してから変数をチェックし、エラーがあればサブルーチンに進むよりもはるかに自然な方法です。

$stfp->ls or die qq(Cannot access remote machine ) . HOST;

こちらもインデントしていただけると助かります。コードの追跡が容易になります。

Perl には、変数はすべて小文字でなければならないという標準があり、最新の標準は、変数名を区切るためにアンダースコアを使用することです。定数はすべて大文字にする必要があります。

モジュールの完全なドキュメントも参照する必要があります。たとえば、失敗時にセッションを強制終了するオブジェクトをautodie作成するときのオプションがあります。これにより、エラーをチェックする必要がないため、コーディングが簡素化されます。Net::SFTP::Foreignsftp

が配列への参照Net::SFTP::Foreign->lsを返すことも知っておく必要があります。したがって、その配列を逆参照する必要があります。また、この配列参照の各エントリが実際にはハッシュへの参照であること、およびファイル名がそのハッシュ参照のキーの下にあることも知っておく必要があります。filename

そして、ドキュメントが言及しているもう 1 つの小さな事実: このプログラムは、Unix/Linux がインストールされsshたクライアントを使用します。sshそのクライアントがインストールされていない場合、これは機能しません。

リファレンスに関する Perl チュートリアルをご覧になることをお勧めします。

私はあなたのプログラムを書き直してautodie、もう少し最新の構文を利用して使用しました。通常、これをテストしますが、残念ながら、Net::SFTP::Foreign がインストールされておらず、テストに使用できるリモート コンピューターもありません。

#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say);
use autodie;

use Net::SFTP::Foreign;

use constant {
    HOST            => "sftp.elsvier.com",
    REMOTE_DIR      => "sample/host",
    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,
);

#
# Fetch Files
#
$sftp->rget( REMOTE_DIR, LOCAL_DIR );

#
# Delete Files
#

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

for my $file ( @files ) {
    $sftp->remove( $file->{filename} ); #Reference to a hash
}

say "Deleted files successfully";

$sftp->disconnect;
于 2013-07-25T02:05:04.960 に答える