··# Сначала создать или обновить общедоступную базу данных.
··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
fi
exec grep −i "$1" $locatedb
Сценарий mkslocatedb основан на идее, что процесс, запущенный с привилегиями root, может временно приобретать привилегии разных пользователей, используя команду su −fm user
. После этого он может выполнить команду find с привилегиями каждого пользователя для создания персонализированных баз данных с именами файлов. Однако, работая с командой su внутри сценария, необходимо соблюдать некоторые меры предосторожности, потому что по умолчанию su не только изменяет действующий идентификатор пользователя, но также импортирует окружение для выбранной учетной записи. Это может приводить к странным и запутывающим сообщениям об ошибках, если только не использовать в команде ф −m— m, запрещающий импорт пользовательского окружения. Флаг −f — это дополнительная мера предосторожности, помогающая предотвратить загрузку файла .cshrc для учетных записей, использующих командную оболочку csh или tcsh.
Еще одна необычная конструкция в строке
, 2>/dev/null, которая отправляет все сообщения об ошибках в пресловутый битоприемник: все, что посылается в /dev/null, исчезает без следа. Это самый простой способ избавиться от неизбежных сообщений о недостаточности привилегий, которые выводит команда find в каждом вызове.
mkslocatedb — сценарий, необычный не только тем, что должен запускаться с привилегиями root, но и тем, что использования команды sudo для его запуска будет недостаточно. Вы должны войти в систему как пользователь root или использовать более мощную команду su, чтобы приобрести привилегии root перед запуском сценария. Это объясняется тем, что su фактически превращает вас в суперпользователя root, тогда как sudo просто дает текущему пользователю привилегии root на время. Команда sudo устанавливает другие права доступа к файлам, чем команда su. Сценарий slocate, конечно, не предъявляет таких требований.
Читать дальше