Более полезная версия df могла бы суммировать числа в колонке «Available» (Доступно) и выводить ее в удобочитаемом виде. Эта задача легко решается с помощью команды awk, как показано в листинге 5.9.
Код
Листинг 5.9. Сценарий diskspace, удобная обертка для df, сообщающая информацию в дружественном формате
··#!/bin/bash
··# diskspace — суммирует доступное дисковое пространство и выводит сумму
··#·· в логичном и удобочитаемом виде
··tempfile="/tmp/available.$$"
··trap "rm −f $tempfile" EXIT
··cat << 'EOF' > $tempfile
······{ sum += $4 }
··END { mb = sum / 1024
········gb = mb / 1024
········printf "%.0f MB (%.2fGB) of available disk space\n", mb, gb
······}
··EOF
··exit 0
Как это работает
Сценарий diskspace опирается на временный awk-сценарий, который сохраняется в каталоге
Запуск сценария
Этот сценарий, который может запустить любой пользователь, выводит короткую строку с информацией о суммарном объеме доступного дискового пространства.
Результаты
В той же системе, где был получен вывод команды df, показанный выше, этот сценарий выведет строку, представленную в листинге 5.10.
Листинг 5.10. Тестирование сценария diskspace
$ diskspace
96199 MB (93.94GB) of available disk space
Усовершенствование сценария
Если в вашей системе несколько многотерабайтных дисков, вы могли научить сценарий автоматически выводить значение в терабайтах. В случае исчерпания дискового пространства будет особенно неприятно увидеть, что доступно всего 0,03 Гб — но это отличный повод запустить сценарий № 36, чтобы подтолкнуть пользователей удалить ненужные файлы, разве не так?
Обратите внимание еще на одну проблему: имеет ли смысл учитывать доступное дисковое пространство на всех устройствах, включая разделы, которые точно не будут заполняться, такие как
№ 39. Реализация защищенной команды locate
Сценарий locate, представленный в сценарии № 19 (глава 2), очень полезен, но создает угрозу безопасности: если процесс сбора данных запустить с привилегиями root, он составит полный список файлов и каталогов во всей системе, независимо от их владельца, что даст возможность обычным пользователям увидеть имена файлов каталогов, к которым у них нет доступа. Процесс сбора информации можно запустить с привилегиями обобщенного пользователя (как это делается в OS X, где mklocatedb запускается с привилегиями пользователя nobody), но и это не самое правильное решение, потому что вам может понадобиться найти файл где-нибудь в дереве вашего домашнего каталога, независимо от наличия прав доступа к этим файлам и каталогам у пользователя nobody.
Одно из решений этой дилеммы состоит в том, чтобы расширить записи, хранящиеся в базе данных locate, дополнив их сведениями о владельце, группе и привилегиях доступа. Но сама база данных mklocatedb все равно останется незащищенной, если только не запускать сценарий locate с привилегией setuid или setgid, чего желательно всячески избегать в интересах безопасности всей системы.