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


Автор: dimon2239 20.10.2015, 09:38
Добрый день. Подскажите пожалуйста, почему не срабатывает put, идет ошибка "Unrecognized or unsupported command". 

Код

#!/usr/local/bin/perl -w
use Net::FTP;
use warnings;
 
$dir = "/tftp/";
$file = "/var/FTP/121251.bin";
 
$ftp = Net::FTP->new("x.x.x.x") or die "Can't connect\n";
$ftp->login('ad', 'sl') or die "Cannot login ", $ftp->message;
$ftp->cwd($dir) or die "Can't cwd to $dir\n", $ftp->message;
$ftp->put($file) or die "Can't put $file into $dir\n $!", $ftp->message;
$ftp->quit() or die "Error closing ftp connection: ", $ftp->message;



Автор: arto 20.10.2015, 16:09
Добавте в new Debug => 9

Автор: a0730 20.10.2015, 18:47
Попробуй добавить строку:
Код

$ftp->binary();

Перед
$ftp->put($file) or die "Can't put $file into $dir\n $!", $ftp->message;


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/ftp-put-file-id5625e187ae2015ca078b4567#findElement_E7045_56266222ae20151a2e04720d_0

Автор: dimon2239 21.10.2015, 07:16
Строку добавил, результат не изменился. Ниже дебаг.
Код

Net::FTP>>> Net::FTP(2.79)
Net::FTP>>>   Exporter(5.71)
Net::FTP>>>   Net::Cmd(2.30)
Net::FTP>>>   IO::Socket::INET(1.35)
Net::FTP>>>     IO::Socket(1.38)
Net::FTP>>>       IO::Handle(1.35)
Net::FTP=GLOB(0xf0dbb0)<<< 220 DSL-101 FTP version 1.0 ready at Wed Oct 21 10:09:49 2015
Net::FTP=GLOB(0xf0dbb0)>>> USER admin
Net::FTP=GLOB(0xf0dbb0)<<< 331 Enter PASS command
Net::FTP=GLOB(0xf0dbb0)>>> PASS ....
Net::FTP=GLOB(0xf0dbb0)<<< 230 Logged in
Net::FTP=GLOB(0xf0dbb0)>>> TYPE I
Net::FTP=GLOB(0xf0dbb0)<<< 200 Type I OK
Net::FTP=GLOB(0xf0dbb0)>>> PORT x,x,x,x,177,117
Net::FTP=GLOB(0xf0dbb0)<<< 200 Port command okay
Net::FTP=GLOB(0xf0dbb0)>>> ALLO 2914746
Net::FTP=GLOB(0xf0dbb0)<<< 500 Unknown command 'allo 2914746'
Net::FTP=GLOB(0xf0dbb0)>>> QUIT
Net::FTP=GLOB(0xf0dbb0)<<< 221 Goodbye!


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/ftp-put-file-id5625e187ae2015ca078b4567#findElement_E7045_562711a9ae2015416f047102_0

Автор: a0730 21.10.2015, 16:08
FTP клиент использует команду ALLO для резервирования места.
Похоже на ошибку в Net::FTP.

Есть ли возможность использовать другой клиент или сервер?

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/ftp-put-file-id5625e187ae2015ca078b4567#findElement_E7045_56278e30ae20156b20047013_0

Автор: tzirechnoy 21.10.2015, 17:54
Учитывая, что в первом RFC, в котором появилась команда STOR (rfc354), объявлена и команда ALLO, и чётко указано: <<The ALLO command should be treated as a NO-OP (no operation) by thuse servers which do not require that the maximum size of the file be declared beforehand.>>, а такжэ тот факт, что никому в Net::FTP это много лет не мешает -- это баг в ftp-сервере, а не в Net::FTP.

Впрочем, можно самому перед put сделать allo(0). Оно вернёт ошыбку, которую можно проигнорировать.

Автор: dimon2239 21.10.2015, 19:04
Я правильно понимаю, так должно быть? 
Код

$ftp->alloc (0);
$ftp->put($file,"ras") or die "Can't put $file into $ip\n $!", $ftp->message;
$ftp->quit();


Выполнил
Код

Net::FTP=GLOB(0x1bc1c00)>>> USER admin
Net::FTP=GLOB(0x1bc1c00)<<< 331 Enter PASS command
Net::FTP=GLOB(0x1bc1c00)>>> PASS ....
Net::FTP=GLOB(0x1bc1c00)<<< 230 Logged in
Net::FTP=GLOB(0x1bc1c00)>>> TYPE I
Net::FTP=GLOB(0x1bc1c00)<<< 200 Type I OK
Net::FTP=GLOB(0x1bc1c00)>>> ALLO 0
Net::FTP=GLOB(0x1bc1c00)<<< 500 Unknown command 'allo 0'
Net::FTP=GLOB(0x1bc1c00)>>> PORT 10,224,81,251,207,54
Net::FTP=GLOB(0x1bc1c00)<<< 200 Port command okay
Net::FTP=GLOB(0x1bc1c00)>>> ALLO 2914746
Net::FTP=GLOB(0x1bc1c00)<<< 500 Unknown command 'allo 2914746'

Автор: a0730 21.10.2015, 21:05
Perl FTP клиент использует команду ALLO.
Проблема в том, что FTP сервер её не подерживает и возвращает ошибку, которая обламывает операцию PUT.
Т.е. клиент и сервер не совместимы.
Поэтому я и спрашивал выше, есть ли возможно заменить клиента (другой не PERL) или сервер (другой хост или другой софт).


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/ftp-put-file-id5625e187ae2015ca078b4567#findElement_E7045_5627d3cdae2015c56804711e_0

Автор: dimon2239 21.10.2015, 22:55
Сервер никак изменить нельзя, т.к. он встроенный в dslam). Только если менять клиент, попробую реализовать на vbs. Жаль что с перлом так получилось.

Автор: tzirechnoy 21.10.2015, 23:38
Цитата
Я правильно понимаю, так должно быть?


Я тут подумал, да с alloc(0) не прокатит. Попробуйте сделать вместо этого ${*$ftp}{'net_ftp_allo'} = 1; перед (каждым) ->put

Автор: a0730 22.10.2015, 06:33
Задачу какую хотите решить?

Понятно, что нужно передать файл на сервер, клиент вроде бы винда.
Какая степень автоматизации нужна?
Как нужно запускать передачу файла?

В C# есть встроенный FTP клиент.
С ним мне тоже пришлось камлать когда-то, но может он подойдёт.

Можно просто нарисовать два файла s.cmd и s.data:

[code=C#]
файл s.data:

open 10.1.27.1
user
password
bin
put IMG_0061.MOV
bye

файл s.cmd:

@echo off
ftp < s.data
pause

[/code]

И запустить s.cmd из командной строки.


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/ftp-put-file-id5625e187ae2015ca078b4567#findElement_E7045_56285915ae2015c377047193_0

Автор: dimon2239 22.10.2015, 06:56
Цитата(tzirechnoy @ 21.10.2015,  23:38)
Цитата
Я правильно понимаю, так должно быть?


Я тут подумал, да с alloc(0) не прокатит. Попробуйте сделать вместо этого ${*$ftp}{'net_ftp_allo'} = 1; перед (каждым) ->put

Спасибо большое, так все работает.
Верно ли понимаю что этой командой мы отключили отправку allo?

p.s. Скрипт на обновление dslam zyxel.

Автор: tzirechnoy 22.10.2015, 12:07
Цитата
Верно ли понимаю что этой командой мы отключили отправку allo?


Это командой вы сделали вид, что команда ALLO для следующего STOR успешно сработала и посылать её в этот раз ужэ не нужно.
Срабатывает только на один STOR, поскольку ALLO как раз на один STOR и рассчитана, и этот счётчик в STOR сбрасывается.

Автор: tzirechnoy 22.10.2015, 12:57
Кстати, если dslam зарегистрирован у производителя, или вообще есть какие-то контакты техподдержки -- то можно попросить чтобы баг с ALLO исправили.

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