Perl - копирование файла (и содержимого) на удаленный сервер с помощью Net: FTP и возможной Net :: FTP :: File - PullRequest
1 голос
/ 01 апреля 2011

У меня много проблем с копированием файла с одного сервера на другой.

Я пытался два дня.

Пожалуйста, знайте, что я использую строгий, и приведенный ниже скрипт только для тестирования.

На самом деле я получаю имя файла на «удаленном» сервере и chmod на 0755, но оно пустое.

1- Файл необходимо скопировать / ftp'd в каталог, предназначенный для "удаленных" серверов. mkdir if!.

2- «Локальный» файл для копирования существует в каталоге, отличном от каталога сценариев.

3 - После того, как файл скопирован на «удаленный» сервер, измените его на 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('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 ]

1 голос
/ 01 апреля 2011

Хорошо, если я надену повязку на глаз и брошу несколько дротиков, я в конечном итоге ударю в быка.

Я не ответил на свой вопрос, но бросил дротик в нужное место.

#!/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, спасатель!

Надеюсь, кому-то этот код будет полезен!

0 голосов
/ 01 апреля 2011

Некоторые заметки:

  • Используйте isfile вместо exits при тестировании, если файл существует.
  • Почему вы никогда не используете else с?
  • $path никогда не используется ($path и $fullpath путаница?.
  • Разве ваша программа не должна die, если локальный файл не существует?
  • Если удаленный файл не существует, вы можете cwd до $copyfrom вместо $datedir.
  • Вы проверяете (isdir) $copyfrom существование после cwd с $copyfrom, поэтому вы действительно проверяете /$copyfrom/$copyfrom Это действительно то, что вы хотите сделать?
  • Почти никто не должен устанавливать режим ascii.

Кстати, попробуйте отключить пассивный режим и попробуйте включить отладку

my $ftp=Net::FTP->new($host,Timeout=>240, Debug=>1) or $newerr=1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...