A transferir & a remoção de ficheiros do SFTP com o módulo estrangeiro do SFTP

a minha exigência é transferir ficheiros e pastas de localização remota SFTP para localização unix. Eu sou novo em perl e shell scripting, e isso tem sido muito confuso. Eu tentei usar o comando rget de SFTP foreign como mostrado abaixo. Mas não funciona e não vai ser transferido. Como é que apago os ficheiros e pastas depois de Os copiar do servidor 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;
}

dentro do sftp location-sample / host, eu tenho muitas pastas e arquivos que todos precisam ser copiado para o servidor unix local-sample / local e apagado do local remoto.

Author: Brian Tompsett - 汤莱恩, 2013-07-25

1 answers

Você precisa obter um bom livro Perl que vai ajudá-lo a aprender a codificar Perl em um estilo mais moderno . Eu recomendo aprender Perl . Isto deve ensinar-lhe algumas técnicas em codificação.

Por exemplo, utilize sempre use strict; e use warnings;. Estes dois módulos captarão cerca de 99% de todos os erros de codificação.

Também, a maneira padrão de fazer uma verificação de erros é usar a sintaxe do estilo or die. Este é um método muito mais natural do que definir uma variável, e então verificando a variável, e se houver um erro, então indo para uma sub-rotina:

$stfp->ls or die qq(Cannot access remote machine ) . HOST;
Também seria bom se também indentasses. Torna mais fácil seguir o teu código.

Perl tem um padrão que as variáveis devem ser todas minúsculas, e o mais novo padrão é usar sublinhados para ajudar a separar os nomes das variáveis. As constantes devem ser todas maiúsculas.

Você também deve olhar para a documentação completa do módulo. Por exemplo, há uma opção autodie quando você cria um Net::SFTP::Foreign objecto que irá matar a tua sessão sftp em qualquer falha. Isso simplifica a codificação porque você não tem que verificar por erros.

Também precisa de saber que Net::SFTP::Foreign->ls devolve uma referênciaa uma matriz. Assim, você precisa dereferenciar esse array. Você também tem que saber que cada entrada nesta referência array é realmente uma referência a um hash, e que o nome do arquivo está sob a chave filename dessa referência de hash.

E mais um pequeno facto: o documento menções: este programa usa o cliente Unix / Linux instalado ssh. Se você não tem esse cliente instalado, isso simplesmente não vai funcionar.

Você pode querer olhar para o Tutorial Perl em referências

Reescrevi o seu programa para tirar partido de autodie e usar uma sintaxe um pouco mais moderna. Normalmente, eu testaria isso, mas infelizmente, eu não tenho Net::SFTP:: Foreign installed, and I don't have a remote computer I can use for testing:
#! /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;
 7
Author: David W., 2016-04-20 19:19:22