Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > FTP error


Автор: infarch 10.2.2012, 11:30
Сделал маленький скрипт для заливки файлов по фтп. На моем хостинге работает нормальною. Отдал заказчику. На его хостинге вылезает ошибка. Вот кусок лога:

Код

c:\work\Projects\aweno\complex5>uploader_ftp.pl
Net::FTP>>> Net::FTP(2.77)
Net::FTP>>>   Exporter(5.65)
Net::FTP>>>   Net::Cmd(2.29)
Net::FTP>>>   IO::Socket::INET(1.31)
Net::FTP>>>     IO::Socket(1.31)
Net::FTP>>>       IO::Handle(1.28)
Net::FTP=GLOB(0x365cdc4)<<< 220 ххх.ххх.ххх.ххх FTP server ready
Connected to ftp.ххххх.ххххх.co.uk
Net::FTP=GLOB(0x365cdc4)>>> USER username
Net::FTP=GLOB(0x365cdc4)<<< 331 Password required for username
Net::FTP=GLOB(0x365cdc4)>>> PASS ....
Net::FTP=GLOB(0x365cdc4)<<< 230 Welcome to Site.UK.
Logged in as username (ftp.ххххх.ххххх.co.uk)
Net::FTP=GLOB(0x365cdc4)>>> TYPE I
Net::FTP=GLOB(0x365cdc4)<<< 200 Type set to I
Switched to binary mode (ftp.ххххх.ххххх.co.uk)
Net::FTP=GLOB(0x365cdc4)>>> ALLO 2785
Net::FTP=GLOB(0x365cdc4)<<< 202 No storage allocation necessary
Net::FTP=GLOB(0x365cdc4)>>> PASV
Net::FTP=GLOB(0x365cdc4)<<< 227 Entering Passive Mode (213,131,252,241,241,4).
Net::FTP=GLOB(0x365cdc4)>>> STOR IOkruga.pm
Net::FTP=GLOB(0x365cdc4)<<< 150 Opening BINARY mode data connection for IOkruga.pm
Net::FTP=GLOB(0x365cdc4)<<< 550 IOkruga.pm: No space left on device
Could not send 'IOkruga.pm' to ftp.ххххх.ххххх.co.uk


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

Если сравнить лог с успешной заливкой на мой хостинг, то видны такие отличия:

Код

Switched to binary mode (s4.ho.ua)
Net::FTP=GLOB(0x37dcd94)>>> ALLO 2785
Net::FTP=GLOB(0x37dcd94)<<< 202 ALLO command ignored.
Net::FTP=GLOB(0x37dcd94)>>> PASV


А вот и герой дня - скрипт который заливает файлы:

Код

sub upload {
    my($addr, $login, $pass, $dir) = @_;
    
    # read the directory
    opendir(my $DIR, $dir) or die "Could not open $dir: $!";
    my @files = readdir $DIR;
    closedir $DIR;
    
    # start uploading
    
    while (@files > 0){
        
        my @failed;
        
        my $ftp = get_connection($addr, $login, $pass);
        
        while( my $file = shift @files ){
            my $path = "$dir/$file";
            unless( -d $path ){
                if( $ftp->put($path) ){
                    print "Uploaded $path\n";
                } else {
                    print "Could not send '$file' to $addr\n";
                    my $msg = $ftp->message();
                    if($msg=~/No space/){
                        $ftp->quit();
                        die "No enough space!";
                    }
                    # try again
                    push @failed, $file;
                }
            }
        }
    
        $ftp->quit();
        
        if(@failed > 0){
            print "Several files was not uploaded to $addr, try again\n";
            sleep 5;
            @files = @failed;
        }
        
    }
    
}

sub get_connection {
    my($addr, $login, $pass) = @_;
    my $ftp;
    while( ! ($ftp = Net::FTP->new($addr, Passive=>1, Debug=>1)) ){
        print "Could not connect to $addr\n";
        sleep 5;
    }
    print "Connected to $addr\n";
    $ftp->login($login, $pass)
        or die "Could not login: ", $ftp->message;
    print "Logged in as $login ($addr)\n";
    $ftp->binary();
    print "Switched to binary mode ($addr)\n";
    return $ftp;
}



Помогите плиз советом, никак не пойму в чем дело.

Автор: tzirechnoy 10.2.2012, 11:59
Цитата
ALLO 2785


Впервые вижу такое. Хотя не должно влиять, конечно.

Очень вероятно, что total commander переходит куда-нибудь в /, а Ваш скрипт никуда не переходит -- это можэт быть какая-то не такая домашняя папка.

Автор: infarch 10.2.2012, 12:04
Я пробовал: $ftp->cwd(".") | $ftp->cwd("./") | $ftp->cwd("/") и все безтолку. Та самая ошибка (

Автор: Pfailed 10.2.2012, 12:05
Сравните сниффером (например wireshark) команды отправляемые Net::FTP и Total Commander

Автор: Agnosticus 2.3.2012, 13:12
Посмотрите через Data::Dumper $ftp объект, что выводит

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)