Jak korzystać z polecenia updatedb jako zwykły użytkownik?

10

locateKomenda jest bardzo przydatnym narzędziem w systemie Linux, ale wydaje się tylko root może uruchomić updatedbkomendę, która jest bardzo unconvinent go używać. Jak więc ustawić zwykłego użytkownika na uprawnienie do uruchamiania polecenia updatedb?

updatedb to komenda używana do aktualizacji bazy danych używana przez komendę locate.

Ale przy próbie uruchomienia updatedb jako zwykły użytkownik pojawia się następujący komunikat o błędzie:

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

Lub:

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

Odpowiedzi:

17

Edytuj polecenie, aby:

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

z „updatedb (8)”:

-l, --require-visibility FLAG

Ustaw flagę „ wymagaj widoczności pliku przed zgłoszeniem ” w wygenerowanej bazie danych do LGR.

Jeśli FLAG ma wartość 0 lub nie, lub jeśli plik bazy danych jest czytelny dla „innych” lub nie jest własnością slocate, locate (1) wysyła wpisy do bazy danych, nawet jeśli użytkownik uruchamiający locate (1) nie mógł odczytać katalogu koniecznego aby znaleźć plik opisany w pozycji bazy danych.

Jeśli FLAG ma wartość 1 lub tak (domyślnie), locate (1) sprawdza uprawnienia katalogów nadrzędnych każdego wpisu przed zgłoszeniem go inwokującemu użytkownikowi. Aby istnienie pliku było naprawdę ukryte przed innymi użytkownikami, grupa baz danych jest ustawiona na slocate, a uprawnienia do bazy danych zabraniają odczytu bazy danych przez użytkowników przy użyciu innych środków niż locate (1), który jest slocate ustawionym przez set-gid.

Pamiętaj, że flaga widoczności jest sprawdzana tylko wtedy, gdy baza danych jest własnością slocate i nie jest czytelna dla „innych”.

użytkownik292632
źródło
wyjaśnisz czym --require-visibilityjest flaga ... ale może mógłbyś wyjaśnić trochę dlaczego? na przykład dlaczego nie zrobić po prostu tego, co robi @xaizek i wygenerować bazę danych w miejscu, w którym użytkownik ma uprawnienia bez użycia --require-visibilityflagi?
Trevor Boyd Smith
później na stronie podręcznika znajduje się odpowiedź na moje pytanie: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

Możesz po prostu stworzyć bazę danych w domu z -oargumentem updatedb:

updatedb -o ~/.locate.db

I użyj tego w slocateten sposób:

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

Prawdopodobnie chcesz zdefiniować alias dla slocate --database=~/.locate.db.

xaizek
źródło
1
w rzeczywistości nawet z opcją -o, nie udało mi się, dlaczego? updatedb -o dbdb updatedb: nie można zmienić grupy pliku `/home/mirror/tmp/dbdb.zwHn1W ': Operacja niedozwolona
hugemeow
1
@ Hugemeow nie jestem pewien, dlaczego tak się dzieje. Być może / mirror / tmp został zamontowany z niestandardowymi opcjami, które zabraniają aktualizacjib zmiany grupy. Chociaż tworzy plik bazy danych z xaizek:userswłaścicielem: para dla mnie, więc grupa jest domyślna. Możesz także sprawdzić opcje w /etc/updatedb.confpliku.
xaizek
czy muszę używać slocate zamiast lokalizować? nie można znaleźć slocate na centos ...
hugemeow
1
@hugemeow slocateto bezpieczniejsza wersja starego locate. Myślę, że centos powinien był slocatezainstalować z nazwą locate. W każdym razie nie powinno być różnic w twoim przypadku, i w zasadzie w większości możliwych przypadków (na Slackware locatejest tylko dowiązaniem symbolicznym slocate).
xaizek
1
@hugemeow Jest napisane, że mlocatepowinno być szybsze, ale nadal zgodne z slocate. Nie jestem pewien, czy to jest powód. Jeśli nie chcesz wypróbować slocate, która strona nie działa, pobierz źródła z jednego z serwerów lustrzanych Slackware, zawierają one źródła pakietów: patrz tutaj .
xaizek
1

Oto wszystkie kroki, aby uzyskać kompletne rozwiązanie (testowane w Centos 6.5)

1) wygeneruj db:

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

2) użyj db:

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

3) Utwórz alias:

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

4) użyj swojego locale zlokalizuj db:

mylocate <my pattern>
Yann Sagon
źródło
użyj $HOMEzamiast ~lub po prostu się go pozbyć =. oba poniższe będą działać: locate --database ~/.locate.dblub locate --database=$HOME/.locate.db. zobacz ten wątek: stackoverflow.com/questions/11587343/…
ardnew