最近的测试过程中遇到了一个由于Linux权限问题导致测试用例验证失败的情况,正好借此机会和大家一起熟悉一下Linux权限相关知识。
问题
为了解决某个问题,开发大大在某次迭代中加入了如下逻辑:当应用的私有目录下的A文件损坏时,程序自动从应用携带的资源文件中复制出同名的文件来替换损坏的文件,这就需要小编模拟A文件损坏的情况下程序能否正常执行完成替换动作。由于在
adb中不方便直接修改文件内容,所以小编采取的方式是创建一个损坏的文件并使用adb的root账户将文件从/sdcard下移动到目标路径/data目录下,但这时的APK应用并不能完成预想的逻辑。由于改动非常简单,review过代码发现没有什么问题,于是猜测可能是权限问题导致文件更新失败。查看移动进去的文件权限如下:
![]()
而其他由应用程序自动创建创建的文件权限是:
![]()
可以看出不论是权限还是拥有者或组名都不一致,于是通过命令将新移动的文件权限和拥有者进行修改与其他文件一致,这时候再进行测试就可以验证通过了。
复习
安卓是基于Linux内核的系统,它的权限管理和Linux基本一致。
-
权限相关基本概念 Linux下文件的权限类型一般包括读,写,执行,对应字母为
r、w、x。权限的粒度有拥有者、群组、其它组(u、g、o)三种。每个文件都可以针对三个粒度,设置不同的r、w、x权限。通常情况下,一个文件只能归属于一个用户和组,如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。 -
数字标识权限格式 针对每个文件的每个粒度权限都可以使用三位二进制的数字表示它们的
rwx权限配置情况,最高位代表r权限的有无,第二位代表w权限的有无,最低位代表x权限的有无。换算为十进制时最高位有的话就是数字4,第二位有的话就是数字2,最低位有的话就是数字1。所以针对某一粒度设置他们的权限时可以使用一个累加的十进制数字表示,比如要同时设置rwx(可读可写可运行)权限则将该权限位设置为4+2+1=7;要同时设置rw-(可读可写不可运行)权限则将该权限位设置为4+2=6;要同时设置r-x(可读可运行不可写)权限则将该权限位设置为4+1=5。 -
更改文件权限的命令——chmod
chmod [-cfvR] [--help] [--version] mode file... -
其中:
-
u表示该文件的拥有(owner), -
g表示与该文件的拥有者属于同一个群体(group)者, -
o表示其他以外(other)人, -
a表示这三者皆是。 -
+表示增加权限、-表示取消权限、=表示唯一设定权限。 -
r表示可读取,w表示可写入,x表示可执行,X表示只有当该文件是个子目录或者该文件已经被设定过为可执行。 -
其他参数说明:
-
-c:若该文件权限确实已经更改,才显示其更改动作-f:若该文件权限无法被更改也不要显示错误讯息-v:显示权限变更的详细资料-R:对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)--help:显示辅助说明--version:显示版本 比如设置a文件为所有人都可读取就是chmod ugo+r a,或者是使用数字标识权限格式chmod 444 a,但是这两种方式的结果不同,前一种是针对a文件给ugo追加了读权限,后一种是给ugo只设置了读权限,可能影响ugo本来就拥有的权限。 -
更改文件所有者的命令——chown
chown [-cfhvR] [--help] [--version] user[:group] file... -
其中 :
user: 新的文件拥有者的使用者ID -
group: 新的文件拥有者的使用者组(group)-c: 显示更改的部分的信息-f: 忽略错误信息-h:修复符号链接-v: 显示详细的处理信息-R: 处理指定目录以及其子目录下的所有文件--help: 显示辅助说明--version: 显示版本 -
比如将文件
a的拥有者设为ownerx,群体的使用者设置为groupx:chown ownerx:groupx a; -
查看文件权限常用命令——ls -l

使用这个命令可以看到文件的详细信息,其中第一个字段就是代表的文件属性字段,该字段共有10个字母组成,其中第一位代表的是文件的类型,类型可以是以下几种中的一个:
d代表的是目录(directroy) -代表的是文件(regular file) s代表的是套字文件(socket) p代表的管道文件(pipe)或命名管道文件(named pipe) l代表的是符号链接文件(symbolic link) b代表的是该文件是面向块的设备文件(block-oriented device file) c代表的是该文件是面向字符的设备文件(charcter-oriented device file) 而剩下的九位就代表的是上面说到的文件的权限,其中前三个表示文件所有者的权限,中间三个表示组用户权限,最后三个表示其他用户权限。
-
Linux的附加权限 Linux除了设置正常的读写操作权限外,还有关于一类设置也是涉及到权限,叫做Linxu附加权限。包括
SET位权限(suid,sgid)和粘滞位权限(sticky)。这里主要介绍Linux的基本权限,关于附加权限就不过多展开解释了。
回顾与小结
再回头看小编遇到的那个问题就可以很简单的定位原因了:应用程序自动创建的文件使用的用户名是
u0_a1996,组名是u0_a1996,而使用root账户创建的文件的所有者是root,所属组名是sdcard_rw,root账户及sdcard_rw组对文件拥有读写权限,但是其他组对文件没有读写权限,所以应用程序更新损坏文件失败了。解决办法主要有三种,第一种方法是修改应用程序的用户组,加入到sdcard_rw组中,第二种方法是修改文件的其它组权限同样为可读可写,第三种方法就是修改文件的拥有者或者是所属组。采用任意一种方法都能够解决问题。 最后在测试过程中还发现当使用root账户向/data目录下cp文件时会保留原路径下文件的权限及所属关系,但是当使用mv命令时则会将源文件的所有权限及所属关系属性全部移动过去,所以上面构造测试数据时使用cp命令也可以避免权限问题的出现。
最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保100%免费】

软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。



本文分享了因Linux权限问题导致测试用例验证失败的经历。开发加入文件替换逻辑,模拟文件损坏测试时遇问题,经排查是权限不一致所致。文中复习了Linux权限相关概念、命令,最后总结问题原因并给出三种解决办法,还分享了软件测试面试资料。


被折叠的 条评论
为什么被折叠?



