Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
··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 в последовательности команд, как показано ниже:
ftp −np << EOF
open $server
user ftp $anonpass
cd $destdir
put "$filename"
quit
EOF
Для доступа к защищенной паролем учетной записи на сервере FTP можно добавить в сценарий запрос пароля в интерактивном режиме, отключив эхо-вывод перед инструкцией read, и включить его снова после ввода:
/bin/echo −n "Password for ${user}: "
stty −echo
read password
stty echo
echo ""
Однако самый грамотный способ организовать ввод пароля — позволить программе FTP самой предложить ввести его, что в нашем сценарии произойдет автоматически: если для доступа к указанной учетной записи потребуется пароль, программа FTP сама предложит сделать это.
№ 54. Извлечение адресов URL из веб-страницы
Простейшее применение lynx заключается в извлечении списка адресов URL, находящихся в данной веб-странице, что может пригодиться при поиске ссылок в Интернете. Выше мы говорили, что в этом издании книги предпочли уйти от lynx в сторону curl, но, как оказывается, lynx в сто раз удобнее для решения этой задачи (см. листинг 7.4), чем curl, потому что автоматически анализирует разметку HTML, тогда как curl вынуждает вас делать это вручную.
В вашей системе нет программы lynx? Большинство современных систем Unix снабжается диспетчерами пакетов, такими как yum в Red Hat, apt в Debian и brew в OS X (впрочем, brew не устанавливается по умолчанию), с помощью которых можно установить lynx. Если вы решите скомпилировать lynx самостоятельно или пожелаете загрузить скомпилированные двоичные файлы, вы найдете все необходимое по адресу: http://lynx.browser.org/.
Код
Листинг 7.4.Сценарий getlinks
#!/bin/bash
# getlinks — получая URL, возвращает все относительные и абсолютные ссылки.
#·· Принимает три параметра: −d генерирует первичные домены в каждой ссылке,
#·· −i выводит список только внутренних ссылок на сайт (то есть на другие
#·· страницы на том же сайте), и −x выводит список только внешних ссылок
#·· (в противоположность −i).
if [$# −eq 0]; then
··echo "Usage: $0 [-d|-i|-x] url" >&2
··echo "-d=domains only, −i=internal refs only, −x=external only" >&2
··exit 1
fi
if [$# −gt 1]; then
··case "$1" in
····-d) lastcmd="cut −f— f3|sort|uniq"
········ shift
········;;
····-r) basedomain="http://$(echo $2 | cut −d/ −f3)/"
········lastcmd="grep \"^$basedomain\"|sed \"s|$basedomain||g\"|sort|uniq"
········shift
········;;
····-a) basedomain="http://$(echo $2 | cut −d/ −f3)/"
········lastcmd="grep −v \"^$basedomain\"|sort|uniq"
········shift
········;;
···· *) echo "$0: unknown option specified: $1" >&2
········exit 1
··esac
else
··lastcmd="sort|uniq"
fi
lynx −dump "$1"|\
··sed −n '/^References$/,$p'|\
··grep −E '[[: digit: ]]+\.'|\
··awk '{print $2}'|\
··cut −d\? -f1 |\
··eval $lastcmd
Интервал:
Закладка: