man locate
说:
The locate database is typically built by user ``nobody'' and the
locate.updatedb(8) utility skips directories which are not readable for
user ``nobody'', group ``nobody'', or world. For example, if your HOME
directory is not world-readable, none of your files are in the database.
由于拥有一个非世界可读的主目录对安全性更好,因此如何使我的主目录可搜索(仅对我而言)?
显然,我可以通过添加find ~ -type f > .locate
incrontab
然后执行 do 来解决这个问题grep <search> ~/.locate
,但是有没有使用内置的标准方法来做到这一点locate
?
答案1
大多数发行版都会在一个包中附带locate
findutils 的工具以及从 crontab 调用的脚本,该脚本将以用户无人身份运行 updatedb。您只需找到这个脚本(例如:在 Debian 9 上它位于/etc/cron.daily/locate
)并对其进行修改以删除用户处理以及更改数据库文件。所以最终的基本形式可以归结为:
updatedb --output="$HOME/locatedb" --localpaths="$HOME"
这可能应该放在一个 crontab 中。
那么用法将是:
locate --database="$HOME/locatedb" somefilepattern
如果您正在使用网络安装并想要对其进行索引等,则必须添加更多选项。
如果您在系统上具有 root 访问权限,并且考虑可能的安全/隐私问题,您可以简化您的生活并使用替代方案mlocate
大多数发行版中也可能提供工具,其行为与定位工具完全相同,只不过它们将所有内容作为根索引(因此永远不会无法索引世界上不可读的目录)到用户无法直接访问的数据库,但使用 setuid/setgid 定位命令将读取它,并且仅当给定用户首先可以访问结果时才允许向该用户显示结果。
答案2
/usr/libexec/locate.updatedb
在我的系统(BSD 变体)上似乎没有 AB 建议的选项。相反,它有:
: ${FCODES:=/var/db/locate.database}
: ${SEARCHPATHS:="/"}
所以我必须这样做:
export SEARCHPATHS=$HOME
export FCODES=$HOME/locatedb
/usr/libexec/locate.updatedb
然后:
$ locate -d ~/locatedb <pattern>
有没有办法在我的系统上设置环境变量?