Компромиссное решение — создавать файл
Код
Защищенная версия 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
··# Сначала создать или обновить общедоступную базу данных.
··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
#·· пользователя по указанному шаблону. Если база данных не найдена, это
#·· означает, что она отсутствует, тогда выводится предупреждающее сообщение