Как использовать команду updatedb как обычный пользователь?

10

Команда locate- очень полезный инструмент в Linux, но кажется, что только root может запустить updatedbкоманду, которая очень неудобна для ее использования. Так как же заставить обычного пользователя иметь привилегию для запуска команды updatedb?

updatedb это команда, используемая для обновления базы данных, используемой командой locate.

Но при попытке запуска updatedb от имени обычного пользователя появляется следующее сообщение об ошибке:

[mirror@home code]$ updatedb
updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db'

Или:

updatedb -o db
updatedb: can not change group of file `/var/lib/gforge/chroot/home/users/bigmeow/tmp/db.uhEZFQ': Operation not permitted
hugemeow
источник

Ответы:

17

Измените команду на:

updatedb --require-visibility 0 -o ~/.locate.db

из "updatedb (8)":

-l, --require-visibility FLAG

Установите флаг « Требовать видимость файла перед тем, как сообщить об этом » в сгенерированной базе данных на FLAG.

Если FLAG равен 0 или нет, или если файл базы данных доступен для чтения «другим» или он не принадлежит slocate, locate (1) выводит записи базы данных, даже если пользователь, выполняющий locate (1), не смог прочитать необходимый каталог выяснить файл, описанный в записи базы данных.

Если FLAG равен 1 или yes (по умолчанию), locate (1) проверяет разрешения родительских каталогов каждой записи, прежде чем сообщать об этом вызывающему пользователю. Чтобы сделать существование файла действительно скрытым от других пользователей, группа базы данных настроена на slocate, а разрешения базы данных запрещают чтение базы данных пользователями, используя другие средства, кроме locate (1), которая является set-gid slocate.

Обратите внимание, что флаг видимости проверяется, только если база данных принадлежит slocate и не доступна для чтения «другим».

user292632
источник
Вы объясняете, что такое --require-visibilityфлаг ... но, может быть, вы могли бы немного объяснить, почему? например, почему бы просто не сделать то, что делает @xaizek, и сгенерировать базу данных в месте, где у вашего пользователя есть разрешение, без использования --require-visibilityфлага?
Тревор Бойд Смит
позже на странице руководства есть ответ на мой вопрос:SECURITY Databases built with --require-visibility no [tbs: or 0] allow users to find names of files and directories of other users, which they would not otherwise be able to do.
Тревор Бойд Смит
3

Вы можете просто создать базу данных в доме с -oаргументом updatedb:

updatedb -o ~/.locate.db

И используйте это slocateтак:

slocate --database=~/.locate.db <pattern>

Вы, вероятно, хотите определить псевдоним для slocate --database=~/.locate.db.

xaizek
источник
1
на самом деле даже с опцией -o я потерпел неудачу, почему? updatedb -o dbdb updatedb: не может изменить группу файла `/home/mirror/tmp/dbdb.zwHn1W ': операция не разрешена
огромный день
1
@ Hugemeow не уверен, почему это происходит. Может быть, / mirror / tmp был смонтирован с нестандартными параметрами, которые запрещают updatedb менять группу. Хотя он создает файл базы данных с xaizek:usersпарой владелец: группа для меня, так что группа - это файл по умолчанию. Вы также можете проверить параметры в /etc/updatedb.confфайле.
xaizek
я должен использовать вместо локации slocate? не могу найти slocate на centos ...
огромный день
1
@hugemeow slocate- более безопасная версия старого locate. Я думаю, что Centos должен был slocateустановить с именем locate. В любом случае, в вашем случае не должно быть никаких различий, и в основном в большинстве возможных случаев (на Slackware locateэто просто символическая ссылка на slocate).
xaizek
1
@ hugemeow Написано, что mlocateдолжно быть быстрее, но все же совместимо с slocate. Я не уверен, если это причина. Если вы не хотите пытаться выяснить slocate, какой сайт не работает, загрузите исходники с одного из зеркал Slackware, они включают источники пакетов: см. Здесь .
xaizek
1

Вот все шаги, чтобы получить полное решение (протестировано в Centos 6.5)

1) сгенерировать БД:

updatedb --require-visibility 0 -o ~/.locate.db

2) использовать БД:

locate --database=/full/path/to/.locate.db (does not work with ~)
or
locate --database=.locate.db

3) создать псевдоним:

alias mylocate='locate --database=/full/path/to/.locate.db'

4) используйте вашу локаль locate db:

mylocate <my pattern>
Ян Сагон
источник
использовать $HOMEвместо ~или просто избавиться от =. оба из следующих будут работать: locate --database ~/.locate.dbили locate --database=$HOME/.locate.db. смотрите эту
ветку