曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3311|回复: 0
打印 上一主题 下一主题

updatedb --  更新 mlocate 数据库

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2013-5-18 00:17:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
mlocate 用来创建或更新 locate 命令所用的数据库。

该命令通常会由 cron(8) 调用以进行定时更新的计划任务。

命令如果更新成功,返回 0,否则返回 1 。

在了解该命令的相关参数之前,可先参考:《/etc/updatedb.conf 文件
》。

-f, --add-prunefs FS
在 PRUNEFS 值列表中添加一种文件系统类型(FS)。

-n, --add-prunenames NAMES
在 NAMES 列表中添加一个目录名(NAMES) 。

-e, --add-prunepaths PATHS
在 PRUNEPATHS 列表中添加一个以路径形式表达的目录名(PATHS)。

-v, --verbose
冗余模式,在该模式下,updatedb 建立或更新数据库时,会输出被更新的文件路径名信息。

-V, --version
打印版本信息,比如:
[beyes@groad.net ~]$ updatedb -V
updatedb (mlocate) 0.22.2
Copyright (C) 2007 Red Hat, Inc. All rights reserved.
This software is distributed under the GPL v.2.

This program is provided with NO WARRANTY, to the extent permitted by law.

-U, --database-root PATH
在建立新的数据库时需要的选项之一。该选项指定一个 PATH 路径,updatedb 会将其下的的所有文件名信息存储到数据库中。举例见下面的 -o 选项。

-o, --output FILE
建立自己的数据库时需要该选项,FILE 表示要生成的数据库名。比如:
[beyes@groad.net ~]$ updatedb -l 0 -U /etc -o beye_etc_sDB
[beyes@groad.net ~]$ ll beye_etc_sDB
-rw-rw-r--. 1 beyes beyes 41829 Mar 21 22:13 beye_etc_sDB
[beyes@groad.net ~]$ locate -d beye_etc_sDB pnm2
/etc/pnm2ppa.conf
在上面的命令中,对 /etc 目录建立相关查询数据库,该数据库被命名为 beyes_etc_sDB 。最后使用 locate 命令测试一下所建立的数据库是否有效,也就是能否从中找到 /etc 下的文件。

--prune-bind-mounts FLAG
设置 PRUNE_BIND_MOUNTS 标志值,0, 1, yes 或 no 这几个值中的一个。这会覆盖 /etc/updatedb.conf 配置文件中的内容。

--prunefs FS
设置 PRUNEFS 值(FS),同样会覆盖配置文件中的内容。

--prunenames NAMES
设置 PRUNENAMES 值(NAMES),同样会覆盖配置文件中的内容。

--prunepaths PATHS
设置 PRUNEPATHS 值(PATHS),同样会覆盖配置文件中的内容。

-l, --require-visibility FLAG
设置数据库中可视需求标志位 FLAG ,其值要么是 0 或 no;要么是 1 或 yes 。

如果 FLAG 是 0 或 no ,或者是数据库文件对 "others" 组为可读,抑或是数据库的用户组不是 slocate 组,那么 locate 也会输出那些原本调用 locate 命令这个用户无法读取的目录里文件信息。举例:
[root@groad.net beyes]# updatedb -l 0 -U /root -o root_lus_DB
[root@groad.net beyes]# ll root_lus_DB
-rw-r--r--. 1 root root 922 Mar 21 23:55 root_lus_DB
[beyes@groad.net ~]$ locate -d root_lus_DB anac
/root/anaconda-ks.cfg
由上面可以看到,我们在命令行中指定可视标志位 0,那么生成的数据库文件对于 others 来说是可读的。于是原本是 /root 下面普通用户不可见的文件,现在也被查找了出来。

如果 FLAG 值为 1 或 yes (默认值),那么 locate 在向调用者输出结果前都会去检查一下相应输出条目父目录的权限。为了使文件确实对 other 用户隐藏,则数据库文件的用户组会被设置为 slocate ,并且你如果不是使用 locate 命令而是使用其它访问手段,你的权限将被禁止。注意,locate 命令是设置了 set-gid 的:
[beyes@groad.net ~]$ ll /usr/bin/locate
-rwx--s--x. 1 root slocate 35548 Oct 10 17:05 /usr/bin/locate
也就是说,当别的用户调用 locate 命令时,它是以 slocate 组的权限来只行的。

再观察一下默认的数据库文件的权限情况:
[beyes@groad.net ~]$ ll -d /var/lib/mlocate/
drwxr-x---. 2 root slocate 4096 Mar 21 03:12 /var/lib/mlocate/
由上可见,/var/lib/mlocate  这个目录对于 slocate 组来说,可进入并且在其中列出文件。再接着看一下 mlocate.db 这个默认数据库文件的权限:
[root@groad.net beyes]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 4833860 Mar 21 03:12 /var/lib/mlocate/mlocate.db
从上面看到,同样对于 slocate 来说,该数据库文件可读。

这样就说明了为什么普通用户在使用 locate 查找该数据库时也能找到一些文件。但是,上面说过,默认的“可视标志”为 1, 也就是说在输出查找到的文件名前要去检查一下父目录的权限,如果父目录并不允许 slocate 浏览的话,那么你就看不到相应的信息。比如在这种情况下,你不能看到 /root 下面的文件名。


我们再来考察一下:
[root@groad.net beyes]# updatedb -l 1 -U /root -o root_lus2_DB
[root@groad.net beyes]# ll root_lus2_DB
-rw-r-----. 1 root slocate 922 Mar 22 00:15 root_lus2_DB
上面使用 root 用户建立了一个数据库,由上可见,该数据库的用户组确实是 slocate,并且只读。因此,当你用其他手段,而不是 locate 来操作这个数据库时,权限自然会被禁止。当我们使用普通用户执行 locate -d root_lus2_DB ana 这条命令时,你将不会看到任何输出,因为父目录是 /root,slocate 并没有权限浏览。如果你用的是 root,那自然是可以的:
[quote[[root@groad.net beyes]# locate -d root_lus2_DB ana
/root/anaconda-ks.cfg[/quote]

最后,需要注意的是,只有当数据库文件的组用户是 slocate 并且对 others 没有读权限时,才会去检查这个可视标志。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 20:08 , Processed in 0.060975 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表