FTP и скрипт на Perl

moldu
На сайте с 27.04.2006
Offline
432
1257

Здравствуйте, у меня возникла проблема с одним Perl скриптом.

Вкратце опишу суть проблемы – существует скрипт, первая часть которого собирает определенные файлы, архивирует их и выкладывает на FTP, а вторая часть забирает их оттуда и разархивирует, скрипт исполняется на локальной машине подключенной к инету. Скрипту уже пару лет, работал он исправно, дважды менялся хостер, в скрипте вносились определенные изменения в авторизации и он продолжал работать. Но тут сайт переехал на Мастерхост и возникла проблема, скрипт качает битые файлы, не хватает 1-2 байт и разархивировать их нельзя, причем при обыкновенной скачке файлов с FTP все нормально, т.е. глючит закачка по скрипту. И еще, особенность такая, ошибка закачки на определенных файлах, т.е. одни файлы качаются нормально, а другие нет, стираешь файлы на сервере, закачиваешь новые, и получаешь битые файлы, но уже другой набор, но этот набор стабилен до новой замены файлов. Файлов обычно 5-7, максимум 10.

Скрипт могу показать и здесь и в личке.

Глаза боятся, а руки-крюки.
Хелпзонович
На сайте с 15.06.2005
Offline
133
#1

Не уверен, что Вам это пооможет, но все таки.

Была похожая проблема, но файлы забирались по HTTP. Тоже приходили битыми. У хостера какой-то косяк с mime types был. Дабы не морочить голову и себе и хостеру, просто сменил расширение у файлов. Т.е. у Вас в скрипт должен заархивировать файлы в archiv.tar. Измените скрипт, что бы получился archiv.zip например.

Вы там держитесь! Хорошего вам настроения. Здоровья.
D
На сайте с 10.10.2005
Offline
28
#2
Хелпзонович:
Не уверен, что Вам это пооможет, но все таки.
Была похожая проблема, но файлы забирались по HTTP. Тоже приходили битыми. У хостера какой-то косяк с mime types был. Дабы не морочить голову и себе и хостеру, просто сменил расширение у файлов. Т.е. у Вас в скрипт должен заархивировать файлы в archiv.tar. Измените скрипт, что бы получился archiv.zip например.

А в FTP какие mime types ???????????

Догагадки

1. Пассивный или активный режим...

2. Бинарный или текстовый режим передачи....

Если можно копию скрипта вышлете в личку...

Я не SEO я программист PERL (Apache 1.3.37 + mod_perl)!!!!! А ещё я люблю FastCGI
moldu
На сайте с 27.04.2006
Offline
432
#3

Внизу приведен скрипт закачки файлов с сервера на локальную машину, исполняется скрипт на локальной машине, подключенной к инету. Есть одна догадка, до этого хостились у Корбины(не известно какой хостинг) и 1гб (Win хостинг) , а сейчас пробовал и Мастерхост (UNIX хостинг) и Infobox (вроде как тоже UNIX хостинг) , может в этом загвоздка? Но скрипт однозначно работает, частично, но работает, битыми приходят НЕ ВСЕ файлы.

Менять расширения файлов не пробовал.

use Net::FTP;

$host_name='host.ru';
$login='логин';
$password='пасс';

$dir='/дир';

open L,">>getp_log";
$time=Time();
print L "$time -> getp\n";


print "Устанавливаем соединение с сервером\n";
$s1=Net::FTP->new($host_name,'Passive'=>1) or die "Соединение НЕ установлено, проверте наличие связи.";
print "Соединение установлено\n";
print "Авторизация\n";
$s1->login($login,$password) or die "err login";

$time=Time();
print L "$time -> login ok\n";

print "Авторизация пройдена\n\n";
$s1->cwd($dir) or die "err cwd";

system 'deltree /Y дир2\\*';
chdir 'дир2' or die 'err chdir';

print "\n";

@ls=$s1->dir() or $s1->quit() and die "err ls";

foreach (@ls)
{
s/^.*\s+(.+)$/$1/;
if(/\.bz2$/)
{
print "Скачиваем $_\n";
$s1->get($_) or print "err get $_";

$time=Time();
print L "$time -> $_ ok\n";

++$i;
}
}

print "\nЗакрываем соединение\n";
$s1->quit() or print "err quit";

$time=Time();
print L "$time -> quit ok\n";

print "Соединение закрыто\n\n";

chdir '..';

system 'copy /Y obpz\\*.bz2 obp';
system 'bzip2 -dvf obp\\*.bz2';

print "\n\nСКАЧЕНО $i ФАЙЛОВ"; <STDIN>;


#==============================sub===================================

sub Time
{
my($y,$m,$d,$h,$mi,$s)=reverse((localtime)[0..5]);
$y+=1900; ++$m;
return sprintf "%04s/%02s/%02s %02s:%02s:%02s", ($y,$m,$d,$h,$mi,$s);
}
Хелпзонович
На сайте с 15.06.2005
Offline
133
#4

В предыдущем сообщении, я немного прогнал :)

Ну, как вариант, после

print L "$time -> login ok\n";

Вставить -

$s1->binary;

moldu
На сайте с 27.04.2006
Offline
432
#5
Хелпзонович:
Вставить -
$s1->binary;

Именно то что нужно!

СПАСИБО Вам огромное. Ник соответствует на 100% ;)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий