如何将locate与一个世界无法读取的主目录一起使用

如何将locate与一个世界无法读取的主目录一起使用

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 > .locateincrontab然后执行 do 来解决这个问题grep <search> ~/.locate,但是有没有使用内置的标准方法来做到这一点locate

答案1

大多数发行版都会在一个包中附带locatefindutils 的工具以及从 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>

有没有办法在我的系统上设置环境变量?

相关内容