आपकी समस्या का समाधान बहुत सरल है (और यह इस उत्तर के अंत में पाया जा सकता है)। लेकिन अगर आप बेहतर जानना चाहते हैं कि त्रुटि क्यों हो रही है और प्रस्तावित समाधान क्यों काम करता है, तो आप पूरे उत्तर को पढ़ सकते हैं।
वास्तव में क्या पता लगाता है।
यह वर्तमान व्यवहार है locate.updatedb
:
- यदि आप स्क्रिप्ट को चला रहे हैं
root
, तो यह उपयोगकर्ता के साथ फिर से कॉल करता है nobody
, और फिर बच्चे लौटते हैं, यह अंतिम लोकेल डेटाबेस को nobody
अस्थायी प्रक्रिया में बच्चों की प्रक्रिया ( उपयोगकर्ता) द्वारा सहेजे गए डेटाबेस के साथ अपडेट करता है , और फिर बाहर निकलता है;
/usr/libexec/locate.updatedb
मेरे द्वारा जोड़े गए अतिरिक्त टिप्पणियों के साथ कोड ( , पंक्ति 31):
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
- जब किसी अन्य उपयोगकर्ता (यह उपयोगकर्ता है
nobody
) के साथ चल रहा है, तो स्क्रिप्ट आपके सिस्टम को अनुक्रमित करती है (उन रास्तों की अनदेखी करना, जिनकी अनुमति नहीं है) और फिर एक अस्थायी फ़ाइल में परिणाम को बचाता है (वास्तव में, इसके पिता द्वारा बनाई गई पहले अस्थायी फ़ाइल। );
- तो, तर्क के हिस्से को रूट के रूप में निष्पादित किया जाता है , और किसी के रूप में अन्य भाग ;
- यदि स्क्रिप्ट को बिना बुलाया जाता है
sudo
, तो यह काम नहीं करेगा (केवल निर्देशिका root
में अनुमति है /var/db
)। यह है, आप वास्तव में शुरू में स्क्रिप्ट के रूप में चलाना चाहिए root
;
- परिणामस्वरूप,
locate.updatedb
आपके घर के अंदर फाइलों को अनुक्रमित नहीं कर सकता ( nobody
उपयोगकर्ता के पास इसे एक्सेस करने की अनुमति नहीं है);
- मुझे लगता है कि
locate.updatedb
इस तरह से अनुक्रमित किया जाता है क्योंकि उपयोगकर्ता के लिए फ़ाइलों का नाम खोजना असंभव होगा जो किसी अन्य उपयोगकर्ता (किसी अन्य होम निर्देशिका में) से संबंधित है;
- यदि आप अपने घर के अंदर फाइलों का पता लगाना चाहते हैं, तो आप
mdfind
@ ted-naleid द्वारा प्रस्तावित उपयोग कर सकते हैं ।
कुछ कोड ( /usr/libexec/locate.updatedb
, लाइन 93, अतिरिक्त टिप्पणियों के साथ):
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
[...]
आपको "अनुमति अस्वीकृत" त्रुटियां क्यों हो रही हैं?
यह कहा गया था कि उपयोगकर्ता के locale.updatedb
रूप में खुद का एक नया उदाहरण लॉन्च करता है nobody
। हालाँकि, आप किसी वर्कडियर के अंदर एक स्क्रिप्ट शुरू नहीं कर सकते जिसमें स्क्रिप्ट की कोई अनुमति नहीं है ।
शायद, आपको "अनुमति अस्वीकृत" त्रुटियां मिल रही हैं क्योंकि आप locale.updatedb
अपने घर के अंदर चल रहे हैं।
मैं इस तथ्य को दिखाने के लिए एक सरल स्क्रिप्ट बना रहा हूं:
#!/bin/bash
if [ $(id -un) != "nobody" ]; then
sudo -u nobody "$0"
exit 0
fi
find / -mindepth 1 -maxdepth 1 | wc -l
यदि आप इस स्क्रिप्ट को अंदर रखते हैं /tmp/test.sh
और इसे क्रियान्वयन की अनुमति देते हैं ( chmod +x /tmp/test.sh
), अपने कार्यदिवस के आधार पर, यह त्रुटि दिखा सकता है या नहीं:
$ 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
अपना पता db कैसे अपडेट करें?
अब, यह आसान है! केवल अपने कार्यदिवस को ऐसी जगह पर बदलें जहाँ nobody
क्रियान्वयन से पहले अनुमति हो locale.updatedb
:
cd /
sudo /usr/libexec/locate.updatedb