|

Полноценное использование служебного Инета
Xakep, номер #039, стр. 039-056-6
print "Content-type: */*\r\n";
print "Location: $newfilelocation\r\n";
print "\r\n";
перенаправляет запрос на только что скачанный файл. Т.е. тебе нужно будет ввести в адресной строке осла или оперы что-то вроде: http://www.mycoolsite.ru/cgi-bin/script.cgi?n=4. Этот скрипт скачает 4-й кусок и сохранит его, например, в "/tmp/xe-xe-xe.004", а затем перенаправит браузер на скачанный файл, т.е. на htpp://www.mycoolsite.ru/tmp/xe-xe-xe.004. Бродилка кинется его качать, и в итоге ты получишь то, что требовалось.
"Зачем же такой гемор с кусками. Может быть стоит залить файло целиком?" - спросишь ты. "Не стоит" - отвечу я. Потому что если файл большой (> 3-5 mb), то вероятность того, что админ обнаружит и заинтересуется его содержимым, велика и возрастает с ростом его размера. Если же файл будет разбит на небольшие куски, то он не будет сильно выделяться в админских логах. Поэтому его и следует качать по кускам.
Рассмотренный только что способ относился к случаю, когда исходный файл лежал на каком-либо http-сервере. Если файл лежит на ftp-сервере, то, немного переделав скрипт, можно решить и эту проблему.
FTP => HTTP
Идея остается той же, нужно лишь переписать куски кода, отвечающие за работу с сервером. Действуем так: вначале коннектимся к нужному серваку, затем отправляем ему следующие команды:
USER anonymous
PASS my@e-mail.address.ru
TYPE I
CWD /pub/mp3/Robert_Miles
REST 1400001
PASV
RETR fable.mp3
Команда REST указывает: с какого байта (здесь правильнее говорить - "октета" = 8 бит) следует передавать файло. Обращаю твое внимание на то, что, в отличие от http, верхнюю границу требуемого куска нигде указать нельзя, поэтому придется самостоятельно контролировать скачанный объем и в нужный момент разрывать соединение. Работа остальных команд уже была рассмотрена выше.
Как и в http, здесь символом перевода строки служит последовательность "\r\n", однако пустую строку в конце запроса передавать не надо (в http формировался запрос, завершающийся пустой строкой, а в ftp запросов нет как таковых, на каждую команду сервер отвечает сразу). Чтобы не усложнять и без того непростой скрипт, я здесь не предусматриваю проверку ответа сервера на каждую команду, хотя это, вообще говоря, делать следует, т.к. практически на каждую из них сервер может ответить отрицательно, и тогда дальнейшие действия становятся бессмысленными. В большинстве случаев все должно работать, но, перед тем как запускать скрипт, я рекомендую вручную (т.е. юзая telnet) попробовать приконнектиться к серверу и ввести эти команды. Либо сделай так, чтобы скрипт логировал все команды и ответы на них.
После отправки указанных выше команд нужно из всех ответов сервера на них вычленить ответ на команду PASV, т.к. она переводит сервер в пассивный режим, и в ответе на нее сервер указывает адрес и порт, куда нужно будет коннектиться для установки соединения данных. Это труда не составит, если знать, что ответ сервера на PASV в случае успеха начинается с числа 227:
Назад на стр. 039-056-5 Содержание Вперед на стр. 039-056-7
|