如何以普通用户身份使用updatedb命令?


10

locate命令在Linux上是非常有用的工具,但似乎只有root可以运行updatedb命令,这对使用它非常不便。那么如何使普通用户具有运行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

Answers:


17

编辑命令以:

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

来自“ updatedb(8)”:

-l, --require-visibility FLAG

将生成的数据库中的“ 在报告之前需要文件可见性 ”标志设置为FLAG。

如果FLAG为0或否,或者数据库文件可被“其他”读取或不属于slocate,则即使运行locate(1)的用户无法读取必要的目录,locate(1)也会输出数据库条目找出数据库条目描述的文件。

如果FLAG为1或yes(默认值),则locate(1)在将每个条目的父目录报告给调用用户之前,先检查其父目录的权限。为了使文件的存在真正被其他用户隐藏,数据库组设置为slocate,并且数据库权限禁止用户使用locate(1)(set-gid slocate)以外的其他方式读取用户的数据库。

注意,仅当数据库由slocate拥有并且“其他”不可读时,才检查可见性标志。


您可以解释--require-visibility标志是什么...但是也许您可以解释一下原因?就像为什么不只执行@xaizek的操作并在用户没有使用该--require-visibility标志的权限的位置生成数据库?
Trevor Boyd Smith,

稍后在手册页中有一个关于我的问题的答案: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

您可以使用以下-o参数在家里创建数据库updatedb

updatedb -o ~/.locate.db

slocate像这样使用它:

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

您可能想为定义一个别名slocate --database=~/.locate.db


1
实际上,即使使用-o选项,我也失败了,为什么?Updatedb -o dbdb Updatedb:无法更改文件组“ /home/mirror/tmp/dbdb.zwHn1W”:不允许操作
hugemeow 2012年

1
@hugemeow不确定为什么会发生。也许/ mirror / tmp是用非标准选项安装的,这禁止updateb更改组。尽管它xaizek:users为我创建了具有owner:group对的数据库文件,所以group是默认的。您还可以检查/etc/updatedb.conf文件中的选项。
xaizek 2012年

我必须使用slocate而不是定位吗?在centos上找不到位置…
hugemeow 2012年

1
@hugemeow slocate是old 的更安全版本locate。我认为centos应该已经slocate安装了name locate。无论如何,您的情况应该没有区别,并且基本上在大多数情况下都没有区别(在Slackware locate上只是的符号链接slocate)。
xaizek 2012年

1
@hugemeow写道,它mlocate应该更快,但仍与兼容slocate。我不确定这是否是原因。如果您不想尝试slocate,哪个站点不起作用,请从Slackware镜像之一下载源,其中包括软件包的源:请参见此处
xaizek 2012年

1

这是拥有完整解决方案的所有步骤(已在Centos 6.5中测试)

1)生成数据库:

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)使用您的语言环境定位数据库:

mylocate <my pattern>

$HOME代替~,或摆脱它=。以下两项都可以使用:locate --database ~/.locate.dblocate --database=$HOME/.locate.db。看到这个线程:stackoverflow.com/questions/11587343/…–
ardnew
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.