Como usar o comando updatedb como um usuário comum?

10

O locatecomando é uma ferramenta muito útil no Linux, mas parece que apenas o root pode executar um updatedbcomando que não é conveniente para usá-lo. Então, como fazer com que o usuário comum tenha o privilégio de executar o comando updatedb?

updatedb é o comando usado para atualizar o db usado pelo comando

Mas há a seguinte mensagem de erro ao tentar executar updatedb como usuário comum:

[mirror@home code]$ updatedb
updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db'

Ou:

updatedb -o db
updatedb: can not change group of file `/var/lib/gforge/chroot/home/users/bigmeow/tmp/db.uhEZFQ': Operation not permitted
hugemeow
fonte

Respostas:

17

Edite o comando para:

updatedb --require-visibility 0 -o ~/.locate.db

de "updatedb (8)":

-l, --require-visibility FLAG

Defina o sinalizador ' exigir visibilidade do arquivo antes de reportá-lo ' no banco de dados gerado como FLAG.

Se FLAG for 0 ou não, ou se o arquivo do banco de dados for legível por "outros" ou não for de propriedade do slocate, o local (1) gera as entradas do banco de dados, mesmo que o usuário que executa o local (1) não possa ter lido o diretório necessário para descobrir o arquivo descrito pela entrada do banco de dados.

Se FLAG for 1 ou yes (o padrão), o local (1) verifica as permissões dos diretórios pai de cada entrada antes de relatá-lo ao usuário que está chamando. Para tornar a existência do arquivo realmente oculta aos outros usuários, o grupo de banco de dados é definido como slocate e as permissões do banco de dados proíbem a leitura do banco de dados pelos usuários usando outros meios que não o localize (1), que é set-gid slocate.

Observe que o sinalizador de visibilidade é verificado apenas se o banco de dados pertencer a slocate e não for legível por "outros".

user292632
fonte
você explica o que é a --require-visibilitybandeira ... mas talvez você possa explicar um pouco sobre o porquê? por que não fazer o que o @xaizek está fazendo e gerar o banco de dados em um local que seu usuário tenha permissão sem usar a --require-visibilitysinalização?
Trevor Boyd Smith
mais tarde na página de manual, há uma resposta para minha pergunta: #SECURITY Databases built with --require-visibility no [tbs: or 0] allow users to find names of files and directories of other users, which they would not otherwise be able to do.
Trevor Boyd Smith
3

Você pode simplesmente criar banco de dados em casa com o -oargumento de updatedb:

updatedb -o ~/.locate.db

E use-o slocateassim:

slocate --database=~/.locate.db <pattern>

Você provavelmente deseja definir um alias para slocate --database=~/.locate.db.

xaizek
fonte
11
de fato, mesmo com a opção -o, falhei, por quê? updatedb -o dbdb updatedb: não é possível alterar o grupo de arquivos `/home/mirror/tmp/dbdb.zwHn1W ': Operação não permitida
hugemeow
11
@ hugemeow não sei por que isso acontece. Talvez o / mirror / tmp tenha sido montado com opções não padrão, que proíbem updatedb de alterar o grupo. Embora ele crie um arquivo de banco de dados com o xaizek:userspar owner: group para mim, o group é o padrão. Você também pode verificar as opções no /etc/updatedb.confarquivo.
precisa saber é
eu tenho que usar slocate ao invés de localizar? não consegue encontrar slocate em centos ...
hugemeow
11
@hugemeow slocateé uma versão mais segura do antigo locate. Eu acho que centos deveria ter slocateinstalado com o nome locate. De qualquer forma, não deve haver diferenças no seu caso, e basicamente na maioria dos casos possíveis (no Slackware locateé apenas um link simbólico para slocate).
xaizek
11
@ hugemeow Está escrito que mlocatedeveria ser mais rápido, mas ainda assim compatível slocate. Não tenho certeza se é esse o motivo. Se você não quiser tentar slocate, qual site não está funcionando, baixar fontes de um dos espelhos do Slackware, eles incluem fontes dos pacotes: veja aqui .
X163 #
1

Aqui estão todas as etapas para ter uma solução completa (testada no Centos 6.5)

1) gere o banco de dados:

updatedb --require-visibility 0 -o ~/.locate.db

2) use o db:

locate --database=/full/path/to/.locate.db (does not work with ~)
or
locate --database=.locate.db

3) crie um alias:

alias mylocate='locate --database=/full/path/to/.locate.db'

4) use seu locale localize db:

mylocate <my pattern>
Yann Sagon
fonte
use em $HOMEvez de ~, ou apenas se livre do =. ambos os seguintes funcionarão: locate --database ~/.locate.dbou locate --database=$HOME/.locate.db. Veja este tópico: stackoverflow.com/questions/11587343/…
ardnew