Дейв Тейлор - Сценарии командной оболочки. 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Результаты
В той же системе, где был получен вывод команды df, показанный выше, этот сценарий выведет строку, представленную в листинге 5.10.
Листинг 5.10.Тестирование сценария diskspace
$ diskspace
96199 MB (93.94GB) of available disk space
Усовершенствование сценария
Если в вашей системе несколько многотерабайтных дисков, вы могли научить сценарий автоматически выводить значение в терабайтах. В случае исчерпания дискового пространства будет особенно неприятно увидеть, что доступно всего 0,03 Гб — но это отличный повод запустить сценарий № 36, чтобы подтолкнуть пользователей удалить ненужные файлы, разве не так?
Обратите внимание еще на одну проблему: имеет ли смысл учитывать доступное дисковое пространство на всех устройствах, включая разделы, которые точно не будут заполняться, такие как /boot , или достаточно сообщать информацию только о пользовательских разделах? В последнем случае этот сценарий можно было бы усовершенствовать, добавив вызов grep сразу после вызова df . Используйте grep с именами нужных устройств, чтобы включить в расчеты только определенные устройства, или grep −v с именами ненужных устройств, чтобы исключить из расчетов информацию о них.
№ 39. Реализация защищенной команды locate
Сценарий locate, представленный в сценарии № 19 (глава 2), очень полезен, но создает угрозу безопасности: если процесс сбора данных запустить с привилегиями root, он составит полный список файлов и каталогов во всей системе, независимо от их владельца, что даст возможность обычным пользователям увидеть имена файлов каталогов, к которым у них нет доступа. Процесс сбора информации можно запустить с привилегиями обобщенного пользователя (как это делается в OS X, где mklocatedb запускается с привилегиями пользователя nobody), но и это не самое правильное решение, потому что вам может понадобиться найти файл где-нибудь в дереве вашего домашнего каталога, независимо от наличия прав доступа к этим файлам и каталогам у пользователя nobody.
Одно из решений этой дилеммы состоит в том, чтобы расширить записи, хранящиеся в базе данных locate, дополнив их сведениями о владельце, группе и привилегиях доступа. Но сама база данных mklocatedb все равно останется незащищенной, если только не запускать сценарий locate с привилегией setuid или setgid, чего желательно всячески избегать в интересах безопасности всей системы.
Компромиссное решение — создавать файл .locatedb отдельно для каждого пользователя. Это не самый худший вариант, потому что личные базы данных нужны только пользователям, которые действительно пользуются командой locate. После вызова система создаст файл .locatedb в домашнем каталоге пользователя, а его своевременное обновление можно переложить на задание cron, выполняющееся по ночам. Когда пользователь запустит защищенный сценарий slocate в самый первый раз, он увидит сообщение, предупреждающее о том, что он может выполнять поиск только среди общедоступных файлов. Запустив сценарий на следующий день (в зависимости от того, на какое время запланирован запуск задания cron), пользователи будут получать свои, персонализированные результаты.
Код
Защищенная версия locate состоит из двух сценариев: конструктора базы данных mkslocatedb (представленного в листинге 5.11), и утилиты поиска slocate (представленной в листинге 5.12).
Листинг 5.11.Сценарий mkslocatedb
··#!/bin/bash
··# mkslocatedb — создает центральную базу данных общедоступных файлов,
··#·· выполняясь с привилегиями пользователя nobody, и одновременно обходит
··#·· домашние каталоги всех пользователей в поисках··файла. slocatedb.
··#·· Если файл найден, для пользователя создается дополнительная, личная
··#·· версия базы данных поиска файлов.
··locatedb="/var/locate.db"
··slocatedb=".slocatedb"
··if ["$(id −nu)"!= "root"]; then
····echo "$0: Error: You must be root to run this command." >&2
····exit 1
··fi
··if ["$(grep '^nobody:' /etc/passwd)" = ""]; then
····echo "$0: Error: you must have an account for user 'nobody'" >&2
····echo "to create the default slocate database." >&2
····exit 1
··fi
··cd /·· # Предотвратить проблемы нехватки прав доступа после команды su
··# Сначала создать или обновить общедоступную базу данных.
··su −fm nobody −c "find / −print" > $locatedb 2>/dev/null
··echo "building default slocate database (user = nobody)"
··echo… result is $(wc −l < $locatedb) lines long.
··# Теперь обойти учетные записи пользователей и посмотреть,
··#·· у кого в домашнем каталоге имеется файл. slocatedb.
··for account in $(cut −d: −f1 /etc/passwd)
··do
····homedir="$(grep "^${account}:" /etc/passwd | cut −d: −f6)"
····if ["$homedir" = "/"]; then
······continue·· # Не создавать в корневом каталоге.
····elif [-e $homedir/$slocatedb]; then
······echo "building slocate database for user $account"
······su −m $account −c "find / −print" > $homedir/$slocatedb \
········2>/dev/null
······chmod 600 $homedir/$slocatedb
······chown $account $homedir/$slocatedb
······echo… result is $(wc −l < $homedir/$slocatedb) lines long.
····fi
··done
··exit 0
Сам сценарий slocate (в листинге 5.12) — это пользовательский интерфейс к базе данных slocate.
Листинг 5.12.Сценарий slocate, сопутствующий сценарий для mkslocatedb
#!/bin/bash
# slocate — выполняет поиск собственной, защищенной базы данных locatedb
#·· пользователя по указанному шаблону. Если база данных не найдена, это
#·· означает, что она отсутствует, тогда выводится предупреждающее сообщение
#·· и создается новая база данных. Если личная база данных. slocatedbis пустая,
#·· вместо нее используется системная.
locatedb="/var/locate.db"
slocatedb="$HOME/.slocatedb"
if [! -e $slocatedb −o "$1" = "-explain"]; then
··cat << "EOF" >&2
Warning: Secure locate keeps a private database for each user, and your
database hasn't yet been created. Until it is (probably late tonight),
I'll just use the public locate database, which will show you all
publicly accessible matches rather than those explicitly available to
account ${USER:-$LOGNAME}.
EOF
··if ["$1" = "-explain"]; then
····exit 0
··fi
··# Перед продолжением создать файл. slocatedb, чтобы задание cron заполнило
··#·· его, когда в следующий раз сценарий mkslocatedb будет запущен.
··touch $slocatedb···· # mkslocatedb заполнит этот файл при следующем запуске
··chmod 600 $slocatedb # Установить безопасные привилегии
elif [-s $slocatedb]; then
··locatedb=$slocatedb
else
··echo "Warning: using public database. Use \"$0 −explain\" for details." >&2
fi
if [-z "$1"]; then
··echo "Usage: $0 pattern" >&2
··exit 1
Интервал:
Закладка: