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, nobody
und die untergeordneten Elemente kehren zurück. Sie aktualisieren die endgültige Gebietsschemadatenbank mit der Datenbank, die vom untergeordneten Prozess ( nobody
Benutzer) an einem temporären Speicherort gespeichert wurde, und werden beendet.
Code ( /usr/libexec/locate.updatedb
Zeile 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
sudo
wird, funktioniert es nicht (hat nur root
die Berechtigung im /var/db
Verzeichnis). Es ist, Sie müssen das Skript wirklich zuerst ausführen als root
; - Daher
locate.updatedb
können Dateien in Ihrem Heim nicht indiziert werden (der nobody
Benutzer hat keine Berechtigung, darauf zuzugreifen). - Ich denke,
locate.updatedb
Indizes 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
mdfind
suchen möchten, können Sie diese wie von @ ted-naleid vorgeschlagen verwenden.
Einige Codes ( /usr/libexec/locate.updatedb
Zeile 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.updatedb
eine neue Instanz von sich selbst als nobody
Benutzer 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.updatedb
in 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.sh
und 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 nobody
die Berechtigung vorhanden ist, bevor Sie es ausführen locale.updatedb
:
cd / sudo /usr/libexec/locate.updatedb