Android读写权限分析
Android系统使用的是Linux内核,所以Android系统沿用了linux系统的那一套文件读写权限。
目录
- 1,权限解读
- 1.1,权限分为三种类型:
- 1.2,权限针对的三类对象:
- 1.3,文件和目录的权限区别
- 1.3.1,对于文件
- 1.3.2,对于目录
- 1.4,权限查看实例
- 1.4.1,文件类型和权限信息
- 1.4.2,链接数
- 1.4.3,所有者
- 1.4.4,所属组
- 1.4.5,文件大小
- 1.4.6,时间戳
- 1.4.7,文件名
- 2,权限操作
- 2.1,指令修改
- 2.1.1,方法一
- 2.1.2,方法二
- 2.1.3,方法三
- 2.1.4,目录递归赋权限
- 2.2,代码修改
- 2.2.1,Java层实现
- 2.2.2,C++层实现
1,权限解读
在Linux系统中,读写权限是用来控制用户对文件或目录的访问权限的一种机制。按照用户与组进行分类,针对不同的群体进行了权限管理,用他来确定谁能通过何种方式对文件或目录进行访问和操作。
上面的这张图,涉及到一个文件linux权限的基本信息,包括文件类型、文件权限、以及对应的用户组等信息。
1.1,权限分为三种类型:
Read,读权限,缩写r
Write,写权限,缩写w
Execute,执行权限,缩写x
另,root用户不受文件权限的读写权限限制,但执行权限也会受限制。
1.2,权限针对的三类对象:
owner,文件所属主,缩写u
group,用户所属组,缩写g
other,其他不相关用户,缩写o
1.3,文件和目录的权限区别
对于文件和目录,r、w、x有着稍微不同的作用和含义:
1.3.1,对于文件
r:代表可读(read),可以读取、查看;
w:代表可写(write), 可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件;
x:代表可执行(execute),可以被执行;
1.3.2,对于目录
r:代表可读(read),可以读取,ls 查看目录内容;
w:代表可写(write),可以修改,对目录内创建+删除+重命名目录;
x:代表可执行(execute),可以进入该目录;
1.4,权限查看实例
adb登录android系统,通过ls -l查看,如果是linux系统,也可以 ll指令查看。
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rw-r--r-- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root 17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root 4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx #
上面查询到的信息,一共分为7列。
1.4.1,文件类型和权限信息
第一列,第一个字符表示的是文件类型,其可能是普通文件、目录、符号链接等,可能的值如下:
-:普通文件,如上面的adbd文件的信息中,一个字符就是-
d:目录
l:符号链接
b:块设备文件
c:字符设备文件
s:套接字文件
p:命令管道文件
其余的字符分为三组,每组三个字符,分别代表文件所有者的权限、组内其他用户的权限和其他用户的权限。每组字符的含义如下:
r:可读权限(4)
w:可写权限(2)
x:可执行权限(1)
-:无权限(0)
整理第一列的权限表示如下表格式:
如前面adbd文件的权限为-rw-r–r–,参照上面的表,解读为adbd是个文件,所有者对这个文件可读可写不可执行,所属组用户对文件可读不可写不可执行,其他用户也对此文件可读不可写不可执行。
如果用数字来表示adbd文件权限,二进制应该为110100100,十进制应该为644。
1.4.2,链接数
这一列显示了文件的硬链接数。对于目录,这一列显示了目录下的子目录数。如果是普通文件,这一列显示为-。
1.4.3,所有者
这一列显示了文件的所有者用户名,如上面截图里的实际情况,为root用户,因为本人是root后adb登录创建的文件。
1.4.4,所属组
这一列显示了文件所属的用户组名称,如上面截图里的实际情况,为root组,因为本人是root后adb登录创建的文件。
1.4.5,文件大小
这一列显示了文件的大小,以字节为单位。对于目录,这一列显示为4096,为啥是4096呢??因为在 Linux/Android 系统中,目录本身是一种特殊类型的文件,它存储的是目录条目,系统会给目录分配固定大小的块(block),而默认block大小就是4096字节。
1.4.6,时间戳
这一列显示了文件的最后修改时间或最后访问时间,分为年月日和时分秒。具体显示的日期和时间取决于系统的配置和语言环境。
1.4.7,文件名
这一列显示了文件的名称。
2,权限操作
可以通过chmod指令来修改文件权限,或者也可以通过代码来修改。
2.1,指令修改
使用chmod指令修改,指令格式:chmod [选项] <文件名>
以如下adbd文件为例,修改前权限为:
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rw-r--r-- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root 17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root 4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx #
有几种修改方式,如下。
2.1.1,方法一
示例执行指令chmod 776 adbd
mt2712_saic_as33:/data/testrwx # chmod 776 adbd
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rwxrwxrw- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root 17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root 4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx #
可以看到adbd文件由-rw-r–r–变成了-rwxrwxrw-
2.1.2,方法二
上面是用776数字的方式来表示rwxrwxrw-权限,也可以不用数字而是直接用rwx方式来表示,示例如
mt2712_saic_as33:/data/testrwx # chmod u=rwx,g=rw,o=r adbd
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rwxrw-r-- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root 17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root 4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx #
在执行chmod u=rwx,g=rw,o=r adbd指令后,adbd权限就变成了rwxrw-r–
文件权限的值可以通过字符也可以通过数字来表示,示例如下:
字符:rwx rw- r--
数字:111 110 100
7 6 4
2.1.3,方法三
指令格式:chmod [who opt per] file
这里的who、opt、per可能的值分别为:
who:u g o a //u表示文件所有者,g表示与文件所有者属于同一组的其他用户,o表示其他用户
opt:+ – = // + 、-、= 变更权限,+是增加,-是除去,=相同
per:r w x X //读、写、执行
示例如下
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rwxrw-r-- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root 17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root 4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx # chmod o+w adbd
mt2712_saic_as33:/data/testrwx #
mt2712_saic_as33:/data/testrwx #
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rwxrw-rw- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root 17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrwxrwx 2 root root 4096 2019-01-01 00:33 testdir1
mt2712_saic_as33:/data/testrwx #
这里的chmod o+w adbd,是指给文件adbd文件的other用户添加w写权限,所以权限从rwxrw-r–变成了rwxrw-rw-。
2.1.4,目录递归赋权限
上面介绍的一直是文件的权限,对于目录的权限也是一样的操作方式,对于目录-R是常用的一个参数,用于目录递归赋值权限。
示例,testdir1目录下还有个子目录testdir2目录,通过chmod -R XXX 目录,递归赋值权限
mt2712_saic_as33:/data/testrwx/testdir1 # ls -l
total 4
drw-rw---- 2 root root 4096 2019-01-01 01:56 testdir2 //子目录testdir2原始权限为660
mt2712_saic_as33:/data/testrwx # chmod -R 766 testdir1 //对testdir1以及其子目录都赋值766权限
mt2712_saic_as33:/data/testrwx # ls -l
total 1724
-rwxrw-rw- 1 root root 1759120 2024-11-25 12:42 adbd
lrwxrwxrwx 1 root root 17 2019-01-01 00:08 linktest -> data/testlink.txt
drwxrw-rw- 3 root root 4096 2019-01-01 01:56 testdir1
mt2712_saic_as33:/data/testrwx # cd testdir1/
mt2712_saic_as33:/data/testrwx/testdir1 # ls -l
total 4
drwxrw-rw- 2 root root 4096 2019-01-01 01:56 testdir2 子目录testdir2修改后权限为766
mt2712_saic_as33:/data/testrwx/testdir1 #
2.2,代码修改
2.2.1,Java层实现
因为是对系统得文件做操作,可能会遇到操作权限得问题,比如permission权限和selinux,这些根据实际使用时报错来定位解决。java层实现方式如下所示:
try {
String command = "chmod 777 " + destFile.getAbsolutePath();
Log.i("test", "command = " + command);
Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);
} catch (IOException e) {
Log.i("test","chmod fail!!!!");
e.printStackTrace();
}
或者
File file = new File(context.getFilesDir(), "example.txt");
// 设置可读权限(所有者、组、其他用户)
boolean isReadable = file.setReadable(true, false); // 参数2: 是否递归子项(仅限目录)
// 设置可写权限
boolean isWritable = file.setWritable(true, false);
// 设置可执行权限(通常用于脚本文件)
boolean isExecutable = file.setExecutable(true, false);
2.2.2,C++层实现
通过系统方法chmod(file,mode)修改文件权限,首先你这个服务得有权限修改这个文件,这个操作可能会遇到selinux权限问题。
...
#include <sys/stat.h>//头文件
...
int changeFileRWX(const char* file_path, mode_t mode) {
...
int result = chmod(file_path, (mode_t) mode); //需要文件路径和所需权限即可
...
}