पता लगाने के लिए मैन्युअल रूप से डेटाबेस अपडेट नहीं कर सकते?


5

मैं अपने मैकबुक (10.6.3 स्नो लेपर्ड) पर पता लगाने के लिए इस्तेमाल किए गए डेटाबेस को अपडेट करने की कोशिश कर रहा हूं, लेकिन इस धागे में दिखाए गए आदेशों के बाद भी मुझे कहीं नहीं मिला है। मुझे बस इससे एक त्रुटि मिलती है - अगर मैं इसे सुडो के माध्यम से उपयोग करने का प्रयास करता हूं, तो मुझे इस तरह के एन-एन-डायरेक्टरी के लिए अनुमति से इनकार करने के बारे में कुछ रैकेट मिलते हैं। मैंने इसे रूट (sudo su, फिर कमांड) के रूप में चलाने की कोशिश की और यह भी काम नहीं किया। अपने नियमित टर्मिनल प्रॉम्प्ट पर वापस जाएं, और अब मुझे बस मिल गया है

मैकबुक: ~ मोंटे $ sudo /usr/libexec/locate.updatedb
खोजें:।: अनुमति से इनकार
मैकबुक: ~ मोंटे $।

मैं पूरी तरह से भ्रमित हूं, और आधा डर है कि मैंने इस प्रक्रिया में कुछ किया हो सकता है। किसी सहायता या सुझावों की काफी सराहना की जाएगी!

मोंटे

जवाबों:


7

आप फ़ाइल अनुमतियों (डिस्क उपयोगिता आवेदन में) को सुधारने का प्रयास करना चाह सकते हैं। लगता है कि यह उस के साथ एक मुद्दा हो सकता है।

इसके अलावा, सीधे पता लगाने से संबंधित नहीं है, लेकिन मैंने पाया है कि मैक पर mdfind वास्तव में वही करता है जो मुझे पता लगाने की तुलना में काफी बेहतर चाहिए। यह स्पॉटलाइट के लिए कमांड लाइन इंटरफ़ेस है, और यह आपको फ़ाइल नाम से बस खोजने की सुविधा देता है यदि आप पता लगाना चाहते हैं:

mdfind -name <filename>

बस "mdfind" का उपयोग करने से दोनों फ़ाइल नाम मिलेंगे और फाइलों के अंदर दिखेंगे (एक साथ grep / find put with)।

इसके लिए डेटाबेस को मैन्युअल रूप से अपडेट करने की आवश्यकता नहीं है क्योंकि OSX आपके लिए स्पॉटलाइट जानकारी रखता है।


जाहिरा तौर पर डिस्क ने किया था (करता है) कुछ मुद्दे हैं ... मुझे बैकअप डिस्क से बूट करने और कुछ समस्याओं (कुछ फ़ाइल लिंक) की मरम्मत करने की आवश्यकता थी, जिसके बाद मैंने मुख्य आंतरिक ड्राइव को बूट किया और अनुमतियों की मरम्मत की - और एक पूरी थी सुधारों की भरमार। विचित्र हिस्सा यह है कि अगर मैं डिस्प्ले को क्लियर करने के बाद option रिपेयर परमिशन ’विकल्प को फिर से चलाता हूं ... मुझे फिर से वही त्रुटियां मिलती हैं (कहते हैं कि 'SUID फाइल" सिस्टम / लाइब्रेरी / ... को संशोधित किया गया है और होगा मरम्मत नहीं की जाएगी। और मुझे अभी भी वही संदेश मिलता है जब मैंने पता लगाने की कोशिश की थी। सुडो के माध्यम से ड्यूडबेडब।
मेमिलानुक

5

आपकी समस्या का समाधान बहुत सरल है (और यह इस उत्तर के अंत में पाया जा सकता है)। लेकिन अगर आप बेहतर जानना चाहते हैं कि त्रुटि क्यों हो रही है और प्रस्तावित समाधान क्यों काम करता है, तो आप पूरे उत्तर को पढ़ सकते हैं।

वास्तव में क्या पता लगाता है।

यह वर्तमान व्यवहार है 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

1
launchctl load -wF /System/Library/LaunchDaemons/com.apple.locate.plist

यदि यह मदद नहीं करता है, तो कोशिश करें:

launchctl stop com.apple.locate

launchctl start com.apple.locate

इसके अंदर एक नज़र डालें plist- लॉन्चडैमन /usr/libexec/locate.updatedbखुद को क्रियान्वित करने के अलावा कुछ नहीं करता है। उपयोगकर्ता के पास इसे रूट के रूप में चलाने की अनुमति समस्या है। इसके माध्यम से चलने पर यह काम क्यों करेगा launch?
डैनियल बेक

1

(यह थोड़ा पुराना है, लेकिन जब से मैं आज 10.6 के साथ इसी तरह की समस्या पर खुदाई कर रहा था ...)

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

यह कोई समस्या नहीं है, वास्तव में - यह किसी के लिए find.updatedb su'ing का एक साइड इफेक्ट है, लेकिन आपके होम डायरेक्टरी "कोई नहीं" उपयोगकर्ता द्वारा पठनीय नहीं है।

आप शायद पाएंगे कि सिस्टम फ़ाइलें अभी भी ढूँढे जाने योग्य हैं, लेकिन आपके होम डायरेक्टरी के अंदर कुछ भी नहीं है। आपको अपनी होमडियर की दुनिया को पठनीय / निष्पादन योग्य बनाना होगा। उदाहरण के लिए:

chmod a+rx $HOME

आपको अपने होमडायर की सामग्री की समीक्षा करने की आवश्यकता हो सकती है, लेकिन - यह संभव है कि आप पूरे पेड़ पर एक पुनरावर्ती चामोद नहीं करना चाहते। (~ /। ssh, उदाहरण के लिए, विशिष्ट आवश्यकताएं हैं)। यदि आपके पास एक कस्टम umask सेट है, तो आप उसकी समीक्षा करना चाहेंगे।

एक हैकअरेक्शन विकल्प के रूप में आप /usr/libexec/locate.updatedb स्क्रिप्ट को किसी भी उपयोगकर्ता पर स्विच नहीं करने के लिए संपादित कर सकते हैं:

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

यह इस बात पर ध्यान दिए बिना काम करना चाहिए कि अपडेट कैसे कहा जाता है - लॉन्चड या मैन्युअल रूप से। लेकिन अगर आप OS को अपडेट करते हैं तो वापस लौट सकते हैं। (हालांकि इसका सामना करने देता है, 2014 में अगर आप अभी भी 10.6 पर चल रहे हैं, तो आप शायद अब अपडेट नहीं करेंगे;)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.