use*_*662 1 unix perl sftp delete-file
我的要求是将文件和文件夹从SFTP远程位置传输到unix位置.我是perl和shell脚本的新手,这一直非常令人困惑.我尝试使用sftp foreign中的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;
}
Run Code Online (Sandbox Code Playgroud)
在SFTP位置 - 样本/主机内部,我有许多文件夹和文件都需要复制到本地unix服务器 - sample/local并从远程位置删除.
您需要获得一本好的Perl书籍,它将帮助您学习如何以更现代的方式编写Perl代码.我建议学习Perl.这应该教你一些编码技巧.
例如,始终使用use strict;
和use warnings;
.这两个模块将捕获大约99%的编码错误.
此外,执行错误检查的标准方法是使用or die
样式语法.这是一个比设置变量更自然的方法,然后检查变量,如果有错误,则转到子例程:
$stfp->ls or die qq(Cannot access remote machine ) . HOST;
Run Code Online (Sandbox Code Playgroud)
如果你缩进也会很好.使您的代码更容易.
Perl有一个标准,变量应全部小写,最新的标准是使用下划线来帮助分离变量名.常量应该全部大写.
您还应该查看该模块的完整文档.例如,autodie
当您创建一个会在任何失败时Net::SFTP::Foreign
终止sftp
会话的对象时,有一个选项.这简化了编码,因为您不必检查错误.
您还需要知道Net::SFTP::Foreign->ls
返回对数组的引用.因此,您需要取消引用该数组.您还必须知道此数组引用中的每个条目实际上是对散列的引用,并且文件名在该filename
散列引用的键下.
文档提到的另一个小事实:该程序使用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;
Run Code Online (Sandbox Code Playgroud)