Perl - 使用Net:FTP和Possible Net :: FTP :: File将文件(和内容)复制到远程服务器

时间:2011-03-31 20:19:35

标签: perl ftp net-library

我在将文件从一台服务器复制到另一台服务器时遇到了很多麻烦。

我已经尝试了两天。

请知道我使用严格,以下脚本仅用于测试。

我实际上在“远程”服务器上获取了一个文件“name”,并且chmod为0755,但它是空的。

1-需要将文件复制/ ftp到“远程”服务器特定目录。 mkdir if!。

2-要复制的“本地”文件存在于脚本目录以外的目录中。

3-将文件复制到“远程”服务器后,将其chmod为0755。

除了我之外,看似每个人都很容易。 : - (

下面仅在名称中写入文件,它是空的。

#!/usr/bin/perl -w
use CGI;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
print CGI::header();
use Net::FTP;
use Net::FTP::File;
#use strict;
my $host='ftp.myserver.com';
my $ftp=Net::FTP->new($host,Timeout=>240,Passsive=>1) or $newerr=1;
push @ERRORS, "Can't ftp to $host: $!\n" if $newerr;
myerr() if $newerr;
print qq~Connected<br />~;
$ftp->login('cherry@myserver.com','mypasswd') or die "Cannot login: $@";
$datedir ='04-01-2011';

#################################
$copyfrom = $datedir;
$thisfile = 'index.pl';
$fullpath = $copyfrom.'/'.$thisfile;
$path = '/home/account/public_html/folder/'.$copyfrom;
if (-e $fullpath) {print qq~Copy source exists<br >~;} 
unless (-e $fullpath) {print qq~Copy source does not exist<br >~;} 

#######################################################
my $isdir = $ftp->isdir($datedir);
if (!$isdir){
    print qq~Remote directory does not exist<br >~;
    $ftp->mkdir($datedir) or die $ftp->message;
}
if ($isdir){
    print qq~Remote directory exists<br />~;
}

#############
my $new = $datedir.'/'.$thisfile;
my $isfile = $ftp->exists($new);
if (!$isfile){
    print qq~Remote file does not exist<br />~;
    $ftp->cwd($copyfrom);
    print "I'm in the directory ", $ftp->pwd(), "\n";
    my $chkdir = $ftp->isdir($copyfrom);
    if ($chkdir){print qq~directory exists<br />~;}
    if (!$chkdir){print qq~directory does not exists<br />~;}
    $ftp->ascii() || die $ftp->message;
    $ftp->put($copyfrom, $thisfile) or die $ftp->message;
    $ftp->chmod(755, $thisfile) or warn $ftp->message;
}
if ($isfile){
    print qq~Remote file exists<br >~;
}

$ftp->quit;


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

现在,我也尝试过Net :: FTP :: File和copy();但是,浏览器出错 - 软件错误“当前工作目录”/“”。

我已阅读并阅读测试和测试,直到我发现自己在这里。

除了模块的选择(我在其他地方读过),我做错了什么?

服务器是带有cpanel的共享服务器,因此,我非常受限制,我尝试了这些ftp模块。

我愿意修复我的脚本或一种可以在我的服务器上运行的完全不同的方法。

非常感谢您的帮助..

2 个答案:

答案 0 :(得分:1)

好的,如果我戴上眼罩并投掷一些飞镖,我最终会击中一头公牛。

我没有真正回答我自己的问题,但把飞镖扔到了正确的位置。

#!/usr/bin/perl -w
##########
use CGI;
use strict;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
print CGI::header();
use Net::FTP;
use Net::FTP::File;
######################################
my $host='ftp.mysite.com';
my $username = 'cherry@mysite.com';
my $password='MycAmelsPasSwoRD';
my $dateDir ='2011-03-25';
my $path = '/home/account/public_html/localfolder/inthisfolder';
my $directory = $path.'/'.$dateDir;
my $scriptfile= 'somescript.pl';
my $file = $path.'/'.$dateDir.'/'.$scriptfile;
#################################
my $ftp = Net::FTP->new($host,Timeout=>240,Passsive=>1) or die "Cannot connect to hostname: $@";
$ftp->login($username, $password)  or die $ftp->message;
$ftp->mkdir($dateDir) or die $ftp->message;
$ftp->cwd($dateDir) or die  $ftp->message;
#$ftp->ascii();
$ftp->put($file) or die $ftp->message;
$ftp->chmod(755,$scriptfile) or die $ftp->message;
$ftp->quit();

我确实在stackoverflow上找到了有用的信息,一个救生员!

希望有人会发现我发布的这段代码很有用!

答案 1 :(得分:0)

一些注意事项:

  • 在测试文件是否存在时,使用isfile代替exits
  • 为什么你从不使用else s?
  • $path从未使用过($path$fullpath混淆?。
  • 如果本地文件不存在,您的程序die不应该存在吗?
  • 如果远程文件不存在,则cwd改为$copyfrom而不是$datedir
  • 您正在$copyfrom cwd后测试(isdir)$copyfrom,因此您确实在测试/$copyfrom/$copyfrom。这真的是你想要做的吗?
  • 几乎没有人需要设置ascii模式。

BTW,尝试禁用被动模式,并尝试启用调试

my $ftp=Net::FTP->new($host,Timeout=>240, Debug=>1) or $newerr=1;