Дейв Тейлор - Сценарии командной оболочки. 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
··sneeze
··of the baby, the shriek of the Gryphon, and all the other queer
+ noises, would change (she knew) to the confused clamour of the busy
+ farm-yard-while the lowing of the cattle in the distance would
+ take the place of the Mock Turtle's heavy sobs.
№ 30. Имитация флагов в стиле GNU с помощью quota
Непоследовательная поддержка флагов командами в разных системах Unix и Linux — источник бесконечных проблем для пользователей, которым приходится переключаться между основными разновидностями этих систем, особенно между коммерческими версиями Unix (SunOS/Solaris, HP-UX и другие) и открытой системой Linux. Одна из таких команд −quota. В одних системах Unix она поддерживает длинные флаги, а в других только однобуквенные.
Компактный сценарий (представленный в листинге 4.7) решает эту проблему, отображая любые длинные флаги в эквивалентные однобуквенные альтернативы.
Код
Листинг 4.7.The newquota script
··#!/bin/bash
··# newquota — интерфейс к команде quota, принимающий длинные флаги в стиле GNU
··# quota поддерживает три флага, −g, — v и −q, но этот сценарий
··#·· позволяет передавать также флаги '-group', '-verbose' и '-quiet'.
··flags=""
··realquota="$(which quota)"
··while [$# −gt 0]
··do
····case $1
····in
······-help)······echo "Usage: $0 [-group −verbose −quiet −gvq]" >&2
························ exit 1;;
······-group)····flags="$flags −g";··shift;;
······-verbose)··flags="$flags −v";··shift;;
······-quiet)····flags="$flags −q";··shift;;
······-)········ shift;··············break;;
······*)··········break;········ # Завершить цикл 'while'!
····esac
··done
··exec $realquota $flags "$@"
Как это работает
Фактически весь сценарий состоит из цикла while, который выполняет обход аргументов командной строки, идентифицирует длинные флаги и добавляет в переменную flags соответствующие им однобуквенные флаги. После завершения цикла сценарий просто вызывает оригинальную программу quota и передает ей флаги, указанные пользователем.
Запуск сценария
Существует два способа интеграции подобных оберток в систему. Самый простой: переименовать файл сценария, дав ему имя quota, скопировать его в локальный каталог (например, /usr/local/bin ) и добавить этот каталог в начало списка в переменной PATH, чтобы поиск в нем выполнялся раньше, чем в других стандартных для Linux каталогах ( /bin и /usr/bin ). Другой способ: добавить общесистемный псевдоним, чтобы команда quota, введенная пользователем, в действительности вызывала сценарий newquota. (В некоторых дистрибутивах Linux имеется встроенная утилита для управления общесистемными псевдонимами, как, например, alternatives в Debian.) Однако в последнем случае возникает некоторый риск при включении команды quota с новыми флагами в пользовательские сценарии: если такие сценарии не задействуют интерактивную оболочку входа пользователя, они могут не увидеть настроенный псевдоним и в результате вызовут оригинальную команду quota вместо newquota.
Результаты
В листинге 4.8 приводятся результаты вызовов сценария newquota с флагами −verbose и −quiet.
Листинг 4.8.Тестирование сценария newquota
$ newquota −verbose
Disk quotas for user dtint (uid 24810):
···· Filesystem·· usage·· quota·· limit·· grace·· files·· quota·· limit·· grace
·········· /usr··338262··614400··675840·········· 10703··120000·· 126000
$ newquota −quiet
В режиме −quiet информация выводится, только если пользователь превысил выделенные ему квоты. Как показывают результаты, все работает правильно. И кстати, мы не превысили квоты. Уф-ф!
№ 31. Делаем sftp более похожей на ftp
В составе пакета ssh (Secure Shell) имеется безопасная версия программы ftp (для работы с протоколом File Transfer Protocol), но ее интерфейс может показаться неудобным для тех, кто привык пользоваться старым, замшелым клиентом ftp. Основная проблема в том, что ftp вызывается как ftp remotehost и затем предлагает ввести имя учетной записи и пароль. Программа sftp, напротив, требует передать учетные данные и имя удаленного хоста в командной строке и не работает как должно (или как ожидается), если ей передать только имя хоста.
Простой сценарий-обертка myftp, который приводится в листинге 4.9, дает пользователям возможность вызвать его в точности, как они привыкли вызывать программу ftp, и предлагает ввести необходимые данные.
Код
Листинг 4.9.Сценарий mysftp, более дружественная версия sftp
··#!/bin/bash
··# mysftp-Makes sftp start up more like ftp
··/bin/echo −n "User account: "
··read account
··if [-z $account]; then
····exit 0; # Видимо, пользователь передумал
··fi
··if [-z "$1"]; then
····/bin/echo −n "Remote host: "
····read host
····if [-z $host]; then
······exit 0
····fi
··else
····host=$1
··fi
··# Конец сценария и переключение на sftp.
··#·· Флаг −C разрешает использовать сжатие.
··exec sftp −C $account@$host
Как это работает
В этом сценарии показан один трюк, достойный отдельного упоминания. Здесь используются фактически те же приемы, что уже демонстрировались в предыдущих сценариях, кроме последней строки, где демонстрируется прием, не освещавшийся прежде: вызов команды exec . Эта команда просто замещает текущую выполняющуюся оболочку указанным приложением. Поскольку точно известно, что сценарий ничего не должен делать после вызова команды sftp, этот прием позволит эффективнее распорядиться системными ресурсами. Если бы мы просто вызвали команду sftp, командная оболочка без всякой пользы продолжала бы ждать завершения команды sftp, действующей в отдельной подоболочке.
Запуск сценария
Как и в случае с клиентом ftp, если пользователь не укажет имя удаленного хоста в командной строке, сценарий предложит ввести его. Если сценарий вызван командой mysftp remotehost, в качестве имени хоста будет использоваться remotehost.
Результаты
Давайте посмотрим, что случится, если вызвать этот сценарий и программу sftp без аргументов командной строки. В листинге 4.10 показана попытка запустить программу sftp.
Листинг 4.10.Попытка запустить утилиту sftp без аргументов приводит к появлению малопонятной справочной информации
$ sftp
usage: sftp [-1246Cpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
··········[-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit]
··········[-o ssh_option] [-P port] [-R num_requests] [-S program]
··········[-s subsystem | sftp_server] host
······ sftp [user@]host[: file…]
Интервал:
Закладка: