Например, FTP часто используется для загрузки файлов из Интернета. Именно эту возможность реализует сценарий в листинге 7.1. Нередко файлы находятся на анонимных FTP-серверах, имеющих адреса URL следующего вида: ftp://<���некоторый_сервер>/<���путь>/<���имя_файла>/ .
Листинг 7.1.Сценарий ftpget
··#!/bin/bash
··# ftpget — получая URL в стиле ftp, разворачивает его и пытается получить
··#·· файл, используя прием доступа к анонимному ftp.
··anonpass="$LOGNAME@$(hostname)"
··if [$# −ne 1]; then
····echo "Usage: $0 ftp://…" >&2
····exit 1
··fi
··# Типичный URL: ftp://ftp.ncftp.com/unixstuff/q2getty.tar.gz
··if ["$(echo $1 | cut −c1-6)"!= "ftp://"]; then
····echo "$0: Malformed url. I need it to start with ftp://" >&2
····exit 1
··fi
··server="$(echo $1 | cut −d/ −f3)"
··filename="$(echo $1 | cut −d/ −f4-)"
··basefile="$(basename $filename)"
··echo ${0}: Downloading $basefile from server $server
··ftp −np << EOF
··open $server
··user ftp $anonpass
··get "$filename" "$basefile"
··quit
··EOF
··if [$? -eq 0]; then
····ls −l $basefile
··fi
··exit 0
Основу сценария составляет последовательность команд, передаваемых программе FTP, которая начинается в строке
. Эта последовательность иллюстрирует основы пакетной работы: последовательность инструкций передается отдельной программе так, что принимающая программа (в данном случае FTP) думает, будто инструкции вводятся пользователем. Эта последовательность предписывает открыть соединение с сервером, вводит имя анонимного пользователя (FTP) и пароль по умолчанию, указанный в разделе с настройками сценария (обычно адрес электронной почты), затем дает команду загрузить файл с FTP-сервера и завершает программу после загрузки.
Сценарий очень прост в использовании: достаточно указать полный адрес URL файла на FTP-сервере, и файл будет загружен в текущий каталог, как показано в листинге 7.2.
Листинг 7.2.Запуск сценария ftpget
$ ftpget ftp://ftp.ncftp.com/unixstuff/q2getty.tar.gz
ftpget: Downloading q2getty.tar.gz from server ftp.ncftp.com
-rw-r-r-··1 taylor··staff··4817 Aug 14 1998 q2getty.tar.gz
Некоторые версии FTP более многословны, чем другие. Кроме того, нередки случаи несоответствия реализаций протокола на стороне клиента и на стороне сервера. В подобных ситуациях такие «многословные» программы FTP иногда выводят пугающие сообщения об ошибках, к примеру Unimplemented command («Нереализованная команда»). Вы можете без опаски игнорировать их. Например, в листинге 7.3 показан вывод того же сценария, запущенного в OS X.
Листинг 7.3.Запуск сценария ftpget в OS X
$ ftpget ftp://ftp.ncftp.com/ncftp/ncftp-3.1.5-src.tar.bz2
../Scripts.new/053-ftpget.sh: Downloading q2getty.tar.gz from server ftp.
ncftp.com
Connected to ncftp.com.
220 ncftpd.com NcFTPd Server (licensed copy) ready.
331 Guest login ok, send your complete e-mail address as password.
230-You are user #2 of 16 simultaneous users allowed.
230-
230 Logged in anonymously.
Remote system type is UNIX.
Using binary mode to transfer files.
local: q2getty.tar.gz remote: unixstuff/q2getty.tar.gz
227 Entering Passive Mode (209,197,102,38,194,11)
150 Data connection accepted from 97.124.161.251:57849; transfer starting for
q2getty.tar.gz (4817 bytes).
100 % |*******************************************************| 4817
67.41 KiB/s 00:00 ETA
226 Transfer completed.
4817 bytes received in 00:00 (63.28 KiB/s)
221 Goodbye.
-rw-r-r-··1 taylor··staff··4817 Aug 14··1998 q2getty.tar.gz
Если ваша версия FTP чересчур многословна и вы пользуетесь OS X, программу FTP можно сделать более сдержанной, добавив в ее вызов флаг −V (то есть заменить команду ftp −n командой ftp −nV).
Усовершенствование сценария
В этот сценарий можно добавить автоматическое разархивирование загружаемых файлов (пример разархивирования вы найдете в сценарии № 33, глава 4), имеющих определенные расширения. Многие сжатые файлы, такие как .tar.gz и .tar.bz2 , разархивируются с помощью системной команды tar.
В этот сценарий можно также добавить функцию выгрузки указанного файла на FTP-сервер. Если сервер поддерживает анонимные соединения (в наши дни таких серверов осталось очень немного из-за взломщиков-дилетантов и других злоумышленников, но это уже другая история), вам достаточно будет определить каталог назначения в командной строке или в самом сценарии и заменить команду get на put в последовательности команд, как показано ниже:
Читать дальше