locate 数据库权限分析

本文解析了mlocate.db数据库文件的特殊权限设置及其如何允许普通用户通过locate命令进行文件搜索,同时介绍了在EverythingForLinux项目中读取此数据库的一种解决方案。

locate用到的数据文件mlocate.db 具有特殊的权限,普通用户不能直接修改或读取。下面简要分析一下它的特殊之处,以及给出想要修改或读取这个数据库的几种方法。

locate 使用到的数据库文件是/var/lib/mlocate/mlocate.db。这个文件的详细信息如下:

root@ubuntu:/home/mml# ls -l /var/lib/mlocate/mlocate.db 
-rw-r----- 1 root mlocate 9768467  327 10:02 /var/lib/mlocate/mlocate.db

它的属主和属组分别为root和mlocate,文件权限为rw-r—–,即640,root拥有读写权限,mlocate组用户拥有只读权限,而其他用户则没有任何权限。

更新mlocate.db文件用到的是updatedb命令,这个命令执行需要root权限,直接切换到root用户执行这个命令,或者使用sudo执行updatedb也可。这个很好理解,因为mlcoate.db文件只有root用户才有权修改。

但为什么明明没有读取mlocate.db文件权限的普通用户却可以直接使用locate命令去读这个数据库文件呢,答案在locate命令身上,下面是locate命令信息:

root@ubuntu:/home/mml# ls -l /usr/bin/locate
lrwxrwxrwx 1 root root 24  92  2014 /usr/bin/locate -> /etc/alternatives/locate
root@ubuntu:/home/mml# ls -l /etc/alternatives/locate
lrwxrwxrwx 1 root root 16  92  2014 /etc/alternatives/locate -> /usr/bin/mlocate
root@ubuntu:/home/mml# ls -l /usr/bin/mlocate 
-rwxr-sr-x 1 root mlocate 34452  620  2013 /usr/bin/mlocate

在我的系统(Ubuntu 14.04.3 LTS)中,locate命令经过两次软链接,链接到了/usr/bin/mlocate命令。它的属主为root,属组为mlocate,权限为rwxr-sr-x,即2755,它拥有一个特殊的权限setgid,setgid的作用是让执行该命令的用户以该命令属组的组权限去运行。

也就是说任何人运行mlocate这个命令,最终运行起来的进程的属组都是mlocate,前面讲过mlocate这个组的用户对mlocate.db都有只读权限,所以最终的现象就是任何用户都可以通过locate命令来进行搜索,而只有root管理员才有权限更新这个数据文件。

EverythingForLinux中读取mlocate.db数据库的方法

在做EverythingForLinux第二版的时候,因为要读取这个数据库文件,涉及到权限问题。本来打算读取这个数据库文件,然后写入sqlite数据库作为一个函数和主窗口程序放到一起,将QT主程序属组设置为mlocate,并且给程序添加setgid权限的方式来达到读取mlocate.db的目的。但这个方案被我否定了。

一是因为Makefile中使用chown修改文件属组,使用chmod添加setgid都需要root权限,使用sudo来执行这两个命令,每次make都需要输入一遍密码,很不方便。

再一个是因为窗口程序添加setuid或setgid都是十分不安全的,很可能给系统安全带来危害。

基于前面的两点,我决定另外找办法。最后,locate和updatedb这样一个组合给了我灵感,方案如下:

  1. 将数据库的更新和查询分离,分别写两个程序everything和everything-updatedb,类似locate和updatedb的关系。
  2. 主窗口程序everything在后台调用everything-updatedb程序更新mlocate数据库,然后将mlocate数据库转换到sqlite数据库中。
  3. 权限问题,everything和everything-updatedb皆为普通可执行文件,没有特殊权限,也没有修改属组。everything后台调用everything-updatedb时使用sudo方式。这样就需要用户输入一个密码,而这个密码又不能在命令行中获取。Ubuntu下有gksudo可以解决这个问题,但在其他发行版中一般都不具有。最终受catfish启发,自己实现一个gksudo(此处应该感慨一下开源软件的伟大),最终参照catfish的python源码使用QT实现了一个自己的gksudo。

最终实现效果图:

提示需要更新数据库时的对话框
提示需要更新数据库时的对话框

用户点击unlock按钮后输入密码时的对话框
用户点击unlock按钮后输入密码时的对话框

mlocate.db及SQLite数据库均更新成功时的对话框
mlocate.db及用来查询的sqlite数据库均更新成功时的对话框

任务描述 相关知识 locate updatedb 编程要求 测试说明 任务描述 假设,我们想找一个月前创建的一个文件,但是又不记得具体是放在什么位置,只记得文件的名称,通过本关的学习,我们将可以轻松的完成对文件/目录的搜索。 本关任务:使用locate命令查找系统中的文件。 相关知识 locate locate命令用来查找文件或目录。 locate命令要比其他查找文件命令(例如:find)快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db。 /var/lib/mlocate/mlocate.db这个数据库中含有本地所有文件信息。Linux 系统自动创建这个数据库,并且每天自动更新一次,因此,我们在用locate查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。 接下让我们详细的学习locateupdatedb的使用方法。 locate具体命令如下: locate 命令参数 文件/目录 常用命令参数如下: -c, --count 只输出找到的数量; -d, --database DBPATH 使用DBPATH指定的数据库,而不是默认数据库/var/lib/mlocate/mlocate.db; -i, --ignore-case 忽略大小写; -q, --quiet 安静模式,不会显示任何错误讯息; -e, --existing 只显示当前存在的文件条目; 案例演示1: 搜索etc目录下以pass开头的文件或目录,具体使用如下命令: locate /etc/pass 案例演示2: 搜索包含passwd字母的文件或目录总个数,具体使用如下命令: locate -c passwd updatedb updatedb命令用来创建或更新locate命令所必需的数据库文件。 updatedb命令的执行过程较长,因为在执行时它会遍历整个系统的目录树,并将所有的文件信息写入locate数据库文件中。 具体命令如下: updatedb 命令参数 常用参数如下: -o<文件>:忽略默认的数据库文件,使用指定的slocate数据库文件; -U<目录>:更新指定目录的slocate数据库; -v:显示执行的详细过程; 执行权限updatedb必须以root权限才能执行,如果是普通用户想执行updatedb时,需要在命令前加sudo命令来提升权限为root权限。 案例演示1: 新创建一个testFile文件,更新locate数据库后使用locate命令定位该文件,具体使用如下命令: touch testFile locate testFile sudo updatedb locate testFile 可以看到新创建文件后直接使用locate去查找是没有任何结果的,只有更新数据库后才能查找到新创建的文件。 案例演示2: 删除testFile文件,更新locate数据库后使用locate命令定位该文件,具体使用如下命令: rm testFile locate testFile sudo updatedb -U ./ locate testFile 第三条命令是只更新testFile所在目录的数据库,这样速度比较快,如果不使用该参数,则会更新整个文件系统的内容。 可以看到删除文件后直接使用locate去查找是可以定位到的,但是此时文件已经不存在了,原因是没有马上更新数据库。 编程要求 在右侧编辑器中补充代码,使用locate命令查找系统中的文件,具体编程要求如下: 使用locate命令查找系统中所有包括group字母的文件或目录的总个数; 使用locate命令定位系统中最新创建的文件newFile。 测试说明 平台会对你编写的代码进行评测: 预期输出: 定位group文件/目录个数成功 定位newFile文件成功 只有胜利才能生存,只有成功才有代价,只有耕耘才有收获。——佚名 开始你的任务吧,祝你成功!
最新发布
06-20
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值