locate
コマンドはLinuxで非常に便利なツールですが、updatedb
コマンドを実行できるのはrootだけなので、これを使用するのは非常に困難です。それでは、どのように一般ユーザーにupdatedbコマンドを実行する特権を与えるのでしょうか?
updatedb
は、locateコマンドで使用されるデータベースを更新するために使用するコマンドです。
しかし、updatedbを一般ユーザーとして実行しようとすると、次のエラーメッセージが表示されます。
[mirror@home code]$ updatedb
updatedb: can not open a temporary file for `/var/lib/mlocate/mlocate.db'
または:
updatedb -o db
updatedb: can not change group of file `/var/lib/gforge/chroot/home/users/bigmeow/tmp/db.uhEZFQ': Operation not permitted
コマンドを次のように編集します。
updatedb --require-visibility 0 -o ~/.locate.db
「updatedb(8)」から:
-l, --require-visibility FLAG
生成されたデータベースの「レポートする前にファイルの可視性が必要」フラグをFLAGに設定します。
FLAGが0またはnoの場合、またはデータベースファイルが「others」によって読み取り可能であるか、slocateによって所有されていない場合、locate(1)を実行しているユーザーが必要なディレクトリを読み取れなかった場合でも、locate(1)はデータベースエントリを出力します。データベースエントリによって記述されたファイルを見つけるため。
FLAGが1またはyes(デフォルト)の場合、locate(1)は、呼び出し元のユーザーに報告する前に、各エントリの親ディレクトリの権限をチェックします。ファイルの存在を他のユーザーから完全に隠すために、データベースグループはslocateに設定されており、データベースのパーミッションは、locate(1)(set-gid slocate)以外の方法を使用するユーザーによるデータベースの読み取りを禁止します。
可視性フラグがチェックされるのは、データベースがslocateによって所有されており、「その他」がそれを読み取れない場合のみです。
updatedb
の-o
引数を使用して、家にデータベースを作成できます。
updatedb -o ~/.locate.db
そして、次のようにslocate
とともに使用します。
slocate --database=~/.locate.db <pattern>
おそらく、slocate --database=~/.locate.db
のエイリアスを定義する必要があります。
完全なソリューションを実現するためのすべての手順を次に示します(Centos 6.5でテスト済み)
1)dbを生成します。
updatedb --require-visibility 0 -o ~/.locate.db
2)dbを使用します。
locate --database=/full/path/to/.locate.db (does not work with ~)
or
locate --database=.locate.db
3)エイリアスを作成します。
alias mylocate='locate --database=/full/path/to/.locate.db'
4)ロケール検索dbを使用します。
mylocate <my pattern>