adb 移动文件_复习Linux文件权限

前言
小编在最近的测试过程中遇到了一个由于 Linux权限问题导致测试用例验证失败的情况,正好借此机会和大家一起熟悉一下 Linux权限相关知识。
问题

为了解决某个问题,开发大大在某次迭代中加入了如下逻辑:当应用的私有目录下的A文件损坏时,程序自动从应用携带的资源文件中复制出同名的文件来替换损坏的文件,这就需要小编模拟A文件损坏的情况下程序能否正常执行完成替换动作。由于在adb中不方便直接修改文件内容,所以小编采取的方式是创建一个损坏的文件并使用adbroot账户将文件从/sdcard下移动到目标路径/data目录下,但这时的APK应用并不能完成预想的逻辑。由于改动非常简单,review过代码发现没有什么问题,于是猜测可能是权限问题导致文件更新失败。 
查看移动进去的文件权限如下: 

c8b4ab5513731da5070de07f136256ec.png

而其他由应用程序自动创建创建的文件权限是: 

5b5cfbc50de11ffbede20386db104681.png

可以看出不论是权限还是拥有者或组名都不一致,于是通过命令将新移动的文件权限和拥有者进行修改与其他文件一致,这时候再进行测试就可以验证通过了。

复习
安卓是基于 Linux内核的系统,它的权限管理和 Linux基本一致。
  • 权限相关基本概念 Linux下文件的权限类型一般包括读,写,执行,对应字母为rwx。权限的粒度有拥有者、群组、其它组(ugo)三种。每个文件都可以针对三个粒度,设置不同的rwx权限。通常情况下,一个文件只能归属于一个用户和组,如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。

  • 数字标识权限格式 
    针对每个文件的每个粒度权限都可以使用三位二进制的数字表示它们的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,群体的使用者设置为groupxchown ownerx:groupx a

  • 查看文件权限常用命令——ls -l 

    48ea59d29683f6c5ad623a18fb9d8497.png

    使用这个命令可以看到文件的详细信息,其中第一个字段就是代表的文件属性字段,该字段共有10个字母组成,其中第一位代表的是文件的类型,类型可以是以下几种中的一个: d代表的是目录(directroy-代表的是文件(regular files代表的是套字文件(socketp代表的管道文件(pipe)或命名管道文件(named pipel代表的是符号链接文件(symbolic linkb代表的是该文件是面向块的设备文件(block-oriented device filec代表的是该文件是面向字符的设备文件(charcter-oriented device file) 而剩下的九位就代表的是上面说到的文件的权限,其中前三个表示文件所有者的权限,中间三个表示组用户权限,最后三个表示其他用户权限。
  • Linux的附加权限 Linux除了设置正常的读写操作权限外,还有关于一类设置也是涉及到权限,叫做Linxu附加权限。包括SET位权限(suidsgid)和粘滞位权限(sticky)。这里主要介绍Linux的基本权限,关于附加权限就不过多展开解释了。

回顾与小结

再回头看小编遇到的那个问题就可以很简单的定位原因了:应用程序自动创建的文件使用的用户名是u0_a1996,组名是u0_a1996,而使用root账户创建的文件的所有者是root,所属组名是sdcard_rwroot账户及sdcard_rw组对文件拥有读写权限,但是其他组对文件没有读写权限,所以应用程序更新损坏文件失败了。 解决办法主要有三种,第一种方法是修改应用程序的用户组,加入到sdcard_rw组中,第二种方法是修改文件的其它组权限同样为可读可写,第三种方法就是修改文件的拥有者或者是所属组。采用任意一种方法都能够解决问题。 
        最后在测试过程中还发现当使用root账户向/data目录下cp文件时会保留原路径下文件的权限及所属关系,但是当使用mv命令时则会将源文件的所有权限及所属关系属性全部移动过去,所以上面构造测试数据时使用cp命令也可以避免权限问题的出现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值