Não é possível atualizar manualmente o banco de dados para localização?

4

Eu tenho tentado atualizar os bancos de dados usados por localizar no meu Macbook (10.6.3 Snow Leopard), mas mesmo seguindo os comandos mostrados neste

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

Estou totalmente confuso e com medo de ter algo no processo. Qualquer ajuda ou sugestão seria muito apreciada!

Monte

    
por memilanuk 08.07.2010 / 07:10

4 respostas

6

Você pode tentar reparar as permissões de arquivo (no aplicativo Utilitário de Disco). Parece que isso pode ser um problema com isso.

Além disso, não estou diretamente relacionado ao locate, mas descobri que no mac o mdfind realmente faz o que eu quero um pouco melhor do que o locate. É a interface da linha de comando para o Spotlight, e permite que você encontre apenas pelo nome do arquivo, se quiser imitar o locate:

mdfind -name <filename>

Basta usar o "mdfind" para encontrar os nomes dos arquivos e procurar dentro dos arquivos (uma espécie de grep / find juntos).

Não há necessidade de atualizar manualmente o banco de dados para ele, pois o OSX mantém as informações do Spotlight para você.

    
por 09.07.2010 / 03:02
4

A solução para o seu problema é muito simples (e pode ser encontrada no final desta resposta). Mas se você quiser saber melhor por que o erro está ocorrendo e por que a solução proposta funciona, você pode ler a resposta inteira.

O que exatamente localiza.updatedb?

Este é o comportamento atual de locate.updatedb :

  • Se você estiver executando o script como root , ele se chamará novamente com o usuário nobody e, em seguida, os filhos retornarão, ele atualizará o banco de dados de locale final com o banco de dados salvo pelo processo filho ( nobody user ) em um local temporário e, em seguida, sai;

Código ( /usr/libexec/locate.updatedb , linha 31, com comentários adicionais adicionados por mim):

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
  • Ao executar com outro usuário (ou seja, o usuário nobody ), o script indexa seu sistema (ignorando os caminhos que ele não tem permissão) e, em seguida, salva o resultado em um arquivo temporário (na verdade, arquivo temporário criado por seu pai);
    • Assim, parte da lógica é executada como raiz e outra parte como ninguém ;
    • Se o script for chamado sem sudo , não funcionará (somente root tem permissão no diretório /var/db ). É, você deve inicialmente executar o script como root ;
    • Como resultado, locate.updatedb não pode indexar arquivos dentro de sua casa (o usuário nobody não tem permissão para acessá-lo);
    • Acho que locate.updatedb indexa dessa maneira porque será impossível para um usuário descobrir o nome dos arquivos que pertencem a outro usuário (em outro diretório inicial);
    • Se você quiser localizar arquivos em sua casa, use mdfind , conforme proposto por @ ted-naleid.

Algum código ( /usr/libexec/locate.updatedb , linha 93, com comentários adicionais):

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

Por que você está recebendo erros de "Permissão negada"?

Foi dito que locale.updatedb lança uma nova instância de si mesmo como o usuário nobody . No entanto, você não pode iniciar um script dentro de um workdir no qual o script não tenha permissão .

Provavelmente, você está recebendo erros de "Permissão negada" porque está executando locale.updatedb em sua casa.

Estou criando um script simples para mostrar esse fato:

#!/bin/bash

if [ $(id -un) != "nobody" ]; then
    sudo -u nobody "$0"
    exit 0
fi

find / -mindepth 1 -maxdepth 1 | wc -l

Se você colocar esse script dentro de /tmp/test.sh e definir a permissão de execução para ele ( chmod +x /tmp/test.sh ), dependendo do seu workdir, ele poderá mostrar ou não erros:

$ 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

Como atualizar seu db de localização?

Agora é simples! Altere apenas o seu workdir para um local em que nobody tenha permissão antes de executar locale.updatedb :

cd /
sudo /usr/libexec/locate.updatedb
    
por 03.05.2015 / 08:14
1
launchctl load -wF /System/Library/LaunchDaemons/com.apple.locate.plist

Se isso não ajudar, tente:

launchctl stop com.apple.locate

launchctl start com.apple.locate
    
por 25.01.2011 / 15:22
1

(isso é um pouco antigo, mas desde que eu estava cavando em um problema semelhante com 10.6 hoje ...)

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

isso não é um problema, exatamente - é um efeito colateral de locate.updatedb su'ing para nobody, mas seu diretório home não é legível pelo usuário "nobody".

Você provavelmente descobrirá que os arquivos do sistema ainda podem ser encontrados com o locate, mas nada dentro do seu diretório home é. Você precisará tornar seu mundo homedir legível / executável. Por exemplo:

chmod a+rx $HOME

Você pode precisar revisar o conteúdo do seu homedir também - mas é provável que você não queira fazer um chmod recursivo em toda a árvore. (~ / .ssh, por exemplo, tem requisitos específicos). Se você tiver um conjunto personalizado de umask, também será necessário revisá-lo.

Como uma alternativa de hackaround, você pode editar o script /usr/libexec/locate.updatedb para não alternar para o usuário 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

Remova ou comente esse bloco - ou apenas ajuste o teste para outra coisa -

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

Isso deve funcionar independentemente de como a atualização é chamada - por launchd ou manualmente. Mas poderia reverter se você atualizar o sistema operacional. (embora, vamos encarar isso, em 2014, se você ainda estiver executando 10.6, provavelmente não vai atualizar agora;)

    
por 13.12.2014 / 19:56