Übertragen & Löschen Von Dateien vom SFTP Mit SFTP-Foreign-Modul
Meine Forderung ist zum übertragen von Dateien und Ordner, die von SFTP remote-Standort zu unix Lage. Ich bin neu in perl und shell-scripting, und das wurde sehr verwirrend. Ich habe versucht, mit rget Befehl sftp außen, wie unten gezeigt. Aber es funktioniert nicht und es ist nicht immer übertragen werden. Wie lösche ich die Dateien und Ordner nach dem kopieren aus der sftp-server?
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;
}
Innerhalb des SFTP-Ort - Probe/host habe ich viele Ordner und Dateien, die alle kopiert werden müssen, um die lokalen unix-server - Beispiel/local und löschen von remote-Standort.
Das ist ein bisschen off-topic, aber wo hast du lernen, diese Art der übergabe von Argumenten an subs und die Durchführung der Fehlerbehandlung? Hast du das aus irgendeinem tutorial oder eine andere Ressource? Ich würde sehr interessiert an einem link, denn das ist unglaublich schlechter Stil.
InformationsquelleAutor user2616662 | 2013-07-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Sie brauchen, um ein gutes Perl-Buch, das wird Ihnen helfen, lernen, wie Sie Perl-code in einem mehr moderne Stil. Ich empfehle Learning Perl. Dies soll Ihnen beibringen, einige Techniken bei der Codierung.
Zum Beispiel, verwenden Sie immer
use strict;
unduse warnings;
. Diese beiden Module fangen über 99% aller Fehler codieren.Auch, die standard-Art zu tun, einen Fehler zu überprüfen, ist die Verwendung der
or die
syntax. Dies ist eine viel natürlichere Methode als das setzen einer variable und dann überprüfen Sie die variable, und wenn ein Fehler vorhanden ist, dann wird ein Unterprogramm:Es wäre auch schön, wenn Sie eingerückt zu werden. Macht nach Ihrem code leichter.
Perl hat eine standard-Variablen sollten immer klein geschrieben werden, und der neueste standard ist die Verwendung von Unterstrichen, um zu helfen, trennen der Variablen Namen. Konstanten sollten vollständig in Großbuchstaben geschrieben werden.
Sollten Sie auch einen Blick auf das Modul ist die vollständige Dokumentation. Es gibt zum Beispiel eine
autodie
option beim erstellen einerNet::SFTP::Foreign
Objekt, das töten, Ihresftp
- session auf jegliche Fehler. Dies vereinfacht die Kodierung, weil Sie nicht haben, um auf Fehler zu überprüfen.Müssen Sie auch wissen, dass
Net::SFTP::Foreign->ls
gibt eine Referenz in ein array. So, müssen Sie zu dereferenzieren, dass array. Sie müssen auch wissen, dass jeder Eintrag in dieser array-Referenz ist tatsächlich eine Referenz auf einen hash, und dass der name der Datei ist unter derfilename
Schlüssel, die hash-Referenz.Und eine weitere kleine Tatsache das Dokument erwähnt: Dieses Programm nutzt den Unix - /Linux installiert
ssh
client. Wenn Sie nicht haben, dassssh
- client installiert, dies will einfach nicht funktionieren.Möchten Sie vielleicht Blick auf die Perl-Tutorial auf Referenzen
Ich umgeschrieben habe dein Programm zu nutzen
autodie
zu nutzen und ein bisschen mehr modernen syntax. Normalerweise würde ich dies testen, aber leider habe ich nicht Net::SFTP::Foreign installiert, und ich don ' T haben ein remote-computer, den ich benutzen kann zum testen:$sftp = Net::SFTP::Foreign->new(...)
nie versagt. Es gibt immer eine gültige Objekt-und Sie haben zu prüfensftp->error
danach, um zu sehen, wenn die Verbindung fehlgeschlagen ist oder wie Sie hingewiesen haben, benutzen Sie einfach dieautodie
Funktion.Ich wollte schreiben das Beispiel mit den
$sftp->error
nach dernew
und jede Methode aufrufen, bis ich sah, dasautodie
Einstellung. Ich magautodie
. Alle Methoden geschrieben werden solltenautodie
auf fehlerhafte Methode oder eines Konstruktors. Dann, wenn der Entwickler will auch weiterhin, Sie zu benutzeneval
oderTry::Tiny
(sollte ein standard-Modul) zur Verarbeitung von die Ausnahme. Dieser Weg, Sie nicht vergessen zu handhaben, ein Problem.Ich sehe das Problem in meinem post jetzt... Wenn ich gab ein Beispiel, das
or die
syntax, die ich verwendet, dienew
Konstruktor. Ich änderte mein Beispiel zu verwenden$sftp->ls
. Ich untersuchte den code, und du hast Recht: Dienew
immer zurückNet::SFTP::Foreign
Objekt. Ich sehe auch, dass die Entwickler$sftp->{_option} = delete $opt{_option}
. Dies bedeutet, wenn ichoption => 0
oder `option => `, die option wird immer noch eingeschaltet werden. Auch dies ist gegen die Art und Weise die meisten Module sind programmiert. Manchmal, Sie haben wirklich zu Blick auf den code werfen.W: mit
option => 0
oderoption => ""
funktioniert, deaktivieren Sie die option.Ich schaute auf den code, und sah, dass Sie behandelt die Einstellung der Einstellungen der Verfahren durch die Einnahme des status löschen der Schlüssel. Zum Beispiel:
$sftp->{_autodie} = delete $opts{autodie};
. In meine Lektüre, wenn ich hatteautodie => 0
. dann diedelete ${opts{autodie}
würde noch zurück, true, da der Schlüsselautodie
gibt es noch in den$opts
hash, obwohl der Wert für das element in der hash0
. Bin ich etwas fehlt?InformationsquelleAutor David W.