Этот сценарий, который может запустить любой пользователь, выводит короткую строку с информацией о суммарном объеме доступного дискового пространства.
В той же системе, где был получен вывод команды 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
Читать дальше