2011-03-31 39 views
1

我在将文件从一台服务器复制到另一台服务器时遇到了很多麻烦。Perl - 使用Net:FTP和Possible Net :: FTP将文件(和内容)复制到远程服务器::文件

我一直在尝试两天。

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

我实际上得到一个文件“名称”到“远程”服务器和chmod到0755,但它是空的。

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

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

3-文件复制到“远程”服务器后,执行命令chmod到0755

4-容易看似每个人,但我。 :-(

下面写到文件中名存实亡,它是空的

#!/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('[email protected]','mypasswd') or die "Cannot login: [email protected]"; 
$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 ::文件及复印件();但是,错误的浏览器 - - 我已阅读和阅读测试,测试,直到软件错误“当前工作目录‘/’,”

,我在这里找到自己

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

服务器与cPanel共享服务器,所以我非常受限制,因此我尝试了这些ftp模块。

我很乐意解决我的脚本问题或者在我的服务器上运行的一种完全不同的方法。

感谢这么多的任何援助..

回答

0

一些注意事项:

  • 使用isfile而不是exits测试文件是否存在时。
  • 为什么你从不使用else
  • $path是从未使用过($path$fullpath混乱?
  • 应该不是你的程序die如果本地文件不存在?
  • 如果远程文件不存在,你cwd$copyfrom而不是向$datedir
  • cwd荷兰国际集团以$copyfrom后测试(ISDIR)$copyfrom存在,所以你真的测试的/$copyfrom/$copyfrom。这真的是你想要做什么?
  • 一几乎没有人需要设置ascii模式。

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

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

是的,问题是一团糟。我不应该把问题的目录和文件测试作为开始。那些对我来说只是白痴检查。我通常使用elsif和其他要求。该代码实际上只是一个挫败尝试的集合。至于ascii,会采取这样做,因为它必须是一个ascii xfer? – Stephayne 2011-03-31 21:29:48

+0

二进制模式始终传输原始字节,因此传输的文件与原始文件相同。 Ascii模式是古老的东西,不要使用它。 – 2011-03-31 21:40:56

+0

谢谢你的信息! – Stephayne 2011-03-31 22:08:49

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 = '[email protected]'; 
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: [email protected]"; 
$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中找到有用的信息,救命啊!

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

相关问题