Kann die Datenbank nicht manuell für die Suche aktualisieren?

5027
memilanuk

Ich habe versucht, die von locate verwendeten Datenbanken auf meinem Macbook (10.6.3 Snow Leopard) zu aktualisieren, aber selbst das Befolgen der in diesem Thread gezeigten Befehle hat mich nirgendwo hinbekommen . Ich bekomme nur eine Fehlermeldung - wenn ich versuche, es über sudo zu verwenden, bekomme ich ein paar Schlägereien über die Berechtigung, die für ein solches n-solches Verzeichnis verweigert wird. Ich habe versucht, es als root auszuführen (sudo su, dann der Befehl) und das hat auch nicht funktioniert. Kehren Sie zu meiner regulären Terminal-Eingabeaufforderung zurück, und jetzt bekomme ich gerade

macbook: ~ monte $ sudo /usr/libexec/locate.updatedb
find:.: Berechtigung verweigert
Macbook: ~ monte $

Ich bin völlig verwirrt und habe halb Angst, dass ich dabei etwas abgespritzt habe. Jede Hilfe oder Anregung wäre sehr dankbar!

Monte

4

4 Antworten auf die Frage

6
Ted Naleid

Möglicherweise möchten Sie versuchen, Dateiberechtigungen zu reparieren (im Festplatten-Dienstprogramm). Klingt, als könnte es ein Problem sein.

Auch nicht direkt mit locate verwandt, aber ich habe festgestellt, dass mdfind auf dem Mac tatsächlich das tut, was ich will, ein bisschen besser als locate. Es ist die Befehlszeilenschnittstelle für Spotlight. Mit dieser Funktion können Sie nur nach Dateinamen suchen, wenn Sie die Lokalisierung nachahmen möchten:

mdfind -name <filename> 

Wenn Sie nur "mdfind" verwenden, werden sowohl die Dateinamen als auch die Dateien in der Datei gesucht (Art von grep / find zusammengesetzt).

Sie müssen die Datenbank dafür nicht manuell aktualisieren, da OSX die Spotlight-Informationen für Sie verwaltet.

Anscheinend hatte die Festplatte einige Probleme ... Ich musste von einer Sicherungsfestplatte booten und einige Probleme (einige Dateiverknüpfungen) reparieren. Danach habe ich vom internen Hauptlaufwerk gebootet und die Berechtigungen repariert - und es gab eine ganze Korrekturen. Der bizarre Teil ist, wenn ich nach dem Löschen der Anzeige die Option "Reparaturberechtigungen" erneut ausführe ... Ich bekomme die meisten der gleichen Fehler erneut (besagt, dass die "SUID-Datei" System / Library / ... "geändert wurde und wird nicht repariert werden und ich bekomme immer noch die gleiche Meldung, wenn ich versucht habe, locate.updatedb über sudo auszuführen. memilanuk vor 14 Jahren 0
4
Rarylson Freitas

Die Lösung für Ihr Problem ist sehr einfach (und am Ende dieser Antwort zu finden). Wenn Sie jedoch besser wissen möchten, warum der Fehler auftritt und warum die vorgeschlagene Lösung funktioniert, können Sie die gesamte Antwort lesen.

Was genau macht locate.updatedb?

Dies ist das aktuelle Verhalten von locate.updatedb:

  • Wenn Sie das Skript als ausführen root, ruft es sich erneut mit dem Benutzer auf, nobodyund die untergeordneten Elemente kehren zurück. Sie aktualisieren die endgültige Gebietsschemadatenbank mit der Datenbank, die vom untergeordneten Prozess ( nobodyBenutzer) an einem temporären Speicherort gespeichert wurde, und werden beendet.

Code ( /usr/libexec/locate.updatedbZeile 31, mit zusätzlichen von mir hinzugefügten Kommentaren):

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 
  • Wenn Sie mit einem anderen Benutzer (dh dem Benutzer nobody) arbeiten, indiziert das Skript Ihr System (ignoriert die Pfade, für die es keine Berechtigung hat) und speichert das Ergebnis in einer temporären Datei (eigentlich der zuvor vom Vater erstellten temporären Datei) );
    • Ein Teil der Logik wird also als root und ein anderer als niemand ausgeführt .
    • Wenn das Skript ohne aufgerufen sudowird, funktioniert es nicht (hat nur rootdie Berechtigung im /var/dbVerzeichnis). Es ist, Sie müssen das Skript wirklich zuerst ausführen als root;
    • Daher locate.updatedbkönnen Dateien in Ihrem Heim nicht indiziert werden (der nobodyBenutzer hat keine Berechtigung, darauf zuzugreifen).
    • Ich denke, locate.updatedbIndizes auf diese Weise, weil es für einen Benutzer unmöglich ist, den Namen von Dateien zu ermitteln, die einem anderen Benutzer gehören (in einem anderen Basisverzeichnis).
    • Wenn Sie Dateien in Ihrem Zuhause mdfindsuchen möchten, können Sie diese wie von @ ted-naleid vorgeschlagen verwenden.

Einige Codes ( /usr/libexec/locate.updatedbZeile 93 mit zusätzlichen Kommentaren):

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 [...] 

Warum erhalten Sie "Permission Denied" -Fehler?

Es wurde gesagt, dass locale.updatedbeine neue Instanz von sich selbst als nobodyBenutzer gestartet wird . Allerdings können Sie nicht ein Skript in einem workdir starten, in dem das Skript keine Berechtigung hat .

Möglicherweise erhalten Sie "Permission denied" -Fehler, weil Sie locale.updatedbin Ihrem Haus laufen .

Ich erstelle ein einfaches Skript, um diese Tatsache zu zeigen:

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

Wenn Sie dieses Skript einfügen /tmp/test.shund die Ausführungsberechtigung für es ( chmod +x /tmp/test.sh) festlegen, kann es abhängig von Ihrem workdir zu Fehlern führen:

$ 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 

Wie aktualisiere ich deine locate db?

Jetzt ist es einfach! Ändern Sie Ihr workdir nur in einen Ort, an dem nobodydie Berechtigung vorhanden ist, bevor Sie es ausführen locale.updatedb:

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

Wenn es nicht hilft, probiere es aus:

launchctl stop com.apple.locate  launchctl start com.apple.locate 
Werfen Sie einen Blick in die `plist` - das LaunchDaemon führt nichts anderes aus, als` / usr / libexec / locate.updatedb` selbst auszuführen. Der Benutzer hat ein Berechtigungsproblem, das als root ausgeführt wird. Warum hat es beim Laufen über "Starten" funktioniert? Daniel Beck vor 13 Jahren 0
1
keen

(Dies ist ein bisschen alt, aber da ich heute mit 10.6 ein ähnliches Problem ausgraben wollte ...)

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

Dies ist kein Problem, genau genommen - es ist ein Nebeneffekt von locate.updatedb, das sich an niemanden richtet, aber Ihr Home-Verzeichnis kann vom Benutzer "nobody" nicht gelesen werden.

Sie werden wahrscheinlich feststellen, dass Systemdateien immer noch mit locate gefunden werden können, aber nichts in Ihrem Home-Verzeichnis ist. Sie müssen Ihre Homedir-Welt lesbar / ausführbar machen. Zum Beispiel:

chmod a+rx $HOME 

Möglicherweise müssen Sie auch den Inhalt Ihres Homedir überprüfen - es ist jedoch wahrscheinlich, dass Sie keinen rekursiven Chmod im gesamten Baum durchführen möchten. (~ / .ssh hat beispielsweise spezifische Anforderungen). Wenn Sie einen benutzerdefinierten umask-Satz haben, sollten Sie diesen ebenfalls überprüfen.

Als hackaround-Alternative können Sie das Skript /usr/libexec/locate.updatedb so bearbeiten, dass es nicht zu dem Benutzer nobody wechselt:

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 

Entfernen oder kommentieren Sie den Block - oder optimieren Sie den Test mit etwas anderem -

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

Dies sollte unabhängig davon, wie das Update aufgerufen wird, funktionieren - von launchd oder manuell. Kann aber zurückkehren, wenn Sie das Betriebssystem aktualisieren. (Obwohl wir uns ehrlich machen, wenn Sie im Jahr 2014 noch 10.6 ausführen, werden Sie wahrscheinlich nicht jetzt aktualisieren;)