Не удается вручную обновить базу данных для поиска?

5015
memilanuk

Я пытался обновить базы данных, используемые locate на моем Macbook (10.6.3 Snow Leopard), но даже следование командам, приведенным в этой теме, никуда меня не привело. Я просто получаю сообщение об ошибке - если я пытаюсь использовать его через sudo, я получаю некоторую информацию об отказе в разрешении для такого-n-такого каталога. Я попытался запустить его как root (sudo su, затем команда), и это тоже не сработало. Вернитесь к моей обычной терминальной подсказке, и теперь я просто получаю

macbook: ~ monte $ sudo /usr/libexec/locate.updatedb
find:.: Отказано в
доступе macbook: ~ monte $

Я полностью сбит с толку и наполовину боюсь, что, возможно, что-то спрятал в процессе. Любая помощь или предложения будут с благодарностью!

Monte

4

4 ответа на вопрос

6
Ted Naleid

Возможно, вы захотите попробовать восстановить права доступа к файлам (в приложении Дисковая утилита). Похоже, это может быть проблемой с этим.

Кроме того, не имеет прямого отношения к locate, но я обнаружил, что на mac этот mdfind действительно делает то, что я хочу, немного лучше, чем locate. Это интерфейс командной строки для подсветки, и он позволяет вам найти только по имени файла, если вы хотите имитировать locate:

mdfind -name <filename> 

Просто используя «mdfind», вы найдете имена обоих файлов и загляните внутрь файлов (вроде grep / find вместе взятых).

Нет необходимости обновлять базу данных вручную, так как OSX предоставляет информацию о вас.

Видимо, у диска были (есть) некоторые проблемы ... Мне нужно было загрузиться с резервного диска и исправить некоторые проблемы (некоторые ссылки на файлы), после чего я загрузился с основного внутреннего диска и восстановил разрешения - и там было целое множество исправлений. Странная часть, если я перезапущу опцию «восстановить права доступа» после очистки дисплея ... Я снова получаю большинство тех же самых ошибок (говорит, что файл SUID «Система / Библиотека / ...» был изменен и будет не подлежит ремонту. И я все еще получаю то же сообщение, когда пытаюсь запустить locate.updatedb через sudo. memilanuk 14 лет назад 0
4
Rarylson Freitas

The solution for your problem is very simple (and it can be found at the end of this answer). But if you want to know better why the error is occurring and why the proposed solution works, you can read the entire answer.

What exactly does locate.updatedb?

This is the current behavior of locate.updatedb:

  • If you are running the script as root, it calls itself again with the user nobody and, then the children returns, it updates the final locale database with the database saved by the children process (nobody user) in a temporary location, and then exits;

Code (/usr/libexec/locate.updatedb, line 31, with additional comments added by me):

if [ "$(id -u)" = "0" ]; then ## IF ROOT USER rc=0 export FCODES=`mktemp -t updatedb` ## CREATE A TEMP FILE chown nobody $FCODES # TEMP FILE OWNED BY THE NOBODY USER tmpdb=`su -fm nobody -c "$0"` || rc=1 ## CALL ITSELF AS USER NOBODY if [ $rc = 0 ]; then install -m 0444 -o nobody -g wheel $FCODES \ /var/db/locate.database ## INSTALL THE LOCATE DATABASE SAVED \ ## BY THE CHILDREN IN THE TEMP FILE fi rm $FCODES exit $rc ## EXIT fi 
  • When running with another user (it is, the user nobody), the script indexes your system (ignoring the paths which it doesn't have permission) and then saves the result in a temporary file (actually, the previously temp file created by its father);
    • So, part of the logic is executed as root, and other part as nobody;
    • If the script is called without sudo, it won't work (only root has permission in the /var/db directory). It is, you really must initially run the script as root;
    • As a result, locate.updatedb can't index files inside your home (the nobody user doesn't have permission to access it);
    • I think locate.updatedb indexes this way because it will be impossible to an user to discover name of files that belongs to another user (in another home directory);
    • If you want to locate files inside your home, you can use mdfind, as proposed by @ted-naleid.

Some code (/usr/libexec/locate.updatedb, line 93, with additional comments):

if $find -s $SEARCHPATHS $excludes -or -print 2>/dev/null | ## SEARCH $mklocatedb -presort > $tmp ## CREATE LOCALEDB then case X"`$find $tmp -size -257c -print`" in X) cat $tmp > $FCODES;; ## SAVE LOCALEDB IN THE TEMP FILE [...] 

Why are you getting "Permission Denied" errors?

It was said that locale.updatedb launchs a new instance of itself as the nobody user. However, you can't start a script inside a workdir in which the script has no permission.

Probably, you are getting "Permission denied" errors because you're running locale.updatedb inside your home.

I'm creating a simple script to show this fact:

#!/bin/bash if [ $(id -un) != "nobody" ]; then sudo -u nobody "$0" exit 0 fi find / -mindepth 1 -maxdepth 1 | wc -l 

If you put this script inside /tmp/test.sh and set execution permission to it (chmod +x /tmp/test.sh), depending of your workdir, it can show or not errors:

$ cd /tmp $ ./test.sh 29 $ cd ~ $ /tmp/test.sh shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied job-working-directory: error retrieving current directory: getcwd: cannot access parent directories: Permission denied find: .: Permission denied 0 

How to update your locate db?

Now, it's simple! Only change your workdir to a place where nobody has permission before executing locale.updatedb:

cd / sudo /usr/libexec/locate.updatedb 
1
Adrian Zaugg
launchctl load -wF /System/Library/LaunchDaemons/com.apple.locate.plist 

Если это не поможет, попробуйте:

launchctl stop com.apple.locate  launchctl start com.apple.locate 
Загляните внутрь `plist` - LaunchDaemon ничего не делает, кроме как выполняет` / usr / libexec / locate.updatedb`. У пользователя есть проблема с разрешениями, при которой он запускается как root. Почему это работает при запуске через `launch`? Daniel Beck 13 лет назад 0
1
keen

(это немного устарело, но так как я копал аналогичную проблему с 10.6 сегодня ...)

macbook:~ monte$ sudo /usr/libexec/locate.updatedb find: .: Permission denied macbook:~ monte$ 

это точно не проблема, это побочный эффект от locate.updatedb, который никому не нужен, но ваш домашний каталог не читается пользователем "nobody".

Вы, вероятно, обнаружите, что системные файлы все еще можно найти с помощью locate, но внутри вашего домашнего каталога ничего нет. Вам нужно сделать свой мир homedir читабельным / исполняемым. Например:

chmod a+rx $HOME 

Возможно, вам также понадобится просмотреть содержимое вашего homedir - но, скорее всего, вы не хотите делать рекурсивный chmod по всему дереву. (~ / .ssh, например, имеет особые требования). Если у вас есть пользовательский набор umask, вы также захотите просмотреть его.

В качестве альтернативы взлома вы можете отредактировать скрипт /usr/libexec/locate.updatedb, чтобы не переключаться на пользователя nobody:

if [ "$(id -u)" = "0" ]; then rc=0 export FCODES=`mktemp -t updatedb` chown nobody $FCODES tmpdb=`su -fm nobody -c "$0"` || rc=1 if [ $rc = 0 ]; then install -m 0444 -o nobody -g wheel $FCODES /var/db/locate.database fi rm $FCODES exit $rc fi 

Удалить или закомментировать этот блок - или просто настроить тест на что-то другое -

if [ "$(id -u)" = "-99" ]; then 

Это должно работать независимо от того, как обновление вызывается - launchd или вручную. Но может вернуться, если вы обновите ОС. (хотя давайте посмотрим правде в глаза, в 2014 году, если вы все еще используете 10.6, вы, вероятно, не собираетесь обновлять сейчас;)

Похожие вопросы