##################################################
目录
##################################################
安卓系统权限管理
——————————
Linux 权限机制
Android 继承了 Linux 中的文件权限机制
系统中的每个文件和目录都有访问许可权限
以此来确定用户可以通过何种方式对文件和目录进行访问和操作
%%%%%
查看文件目录权限
可以使用 ls 的 -l 参数查看:
cmcc_jiangsu:/tmp # ls / -l
total 1584
dr-xr-xr-x 34 root root 0 2015-01-01 08:00 acct
lrwxrwxrwx 1 root root 11 1970-01-01 08:00 bin -> /system/bin
drwxr-xr-x 2 root root 0 1970-01-01 08:00 boot
drwxrwxr-x 2 system system 0 2015-01-01 08:00 bootfiles
lrwxrwxrwx 1 root root 50 1970-01-01 08:00 bugreports -> /data/user_de/0/com.android.shell/files/bugreports
drwxrwx--- 6 system cache 4096 2015-01-01 08:00 cache
lrwxrwxrwx 1 root root 13 1970-01-01 08:00 charger -> /sbin/charger
drwxr-xr-x 4 root root 0 1970-01-01 08:00 config
lrwxrwxrwx 1 root root 17 1970-01-01 08:00 d -> /sys/kernel/debug
drwxrwx--x 40 system system 4096 2015-01-01 08:00 data
lrwxrwxrwx 1 root root 23 1970-01-01 08:00 default.prop -> system/etc/prop.default
drwxr-xr-x 17 root root 5700 2015-01-01 08:00 dev
lrwxrwxrwx 1 root root 11 1970-01-01 08:00 etc -> /system/etc
drwxr-xr-x 2 root root 0 2015-01-01 08:00 factory
lrwxrwxrwx 1 root root 17 1970-01-01 08:00 info -> /mnt/vendor/param
-rwxr-x--- 1 root root 1496164 1970-01-01 08:00 init
-rwxr-x--- 1 root root 1194 1970-01-01 08:00 init.environ.rc
-rwxr-x--- 1 root root 29759 1970-01-01 08:00 init.rc
-rwxr-x--- 1 root root 14865 1970-01-01 08:00 init.recovery.amlogic.rc
-rwxr-x--- 1 root root 7690 1970-01-01 08:00 init.usb.configfs.rc
-rwxr-x--- 1 root root 5646 1970-01-01 08:00 init.usb.rc
-rwxr-x--- 1 root root 511 1970-01-01 08:00 init.zygote32.rc
drwxr-xr-x 4 root root 4096 2015-01-01 08:00 metadata
drwxr-xr-x 11 root system 240 2015-01-01 08:00 mnt
drwxr-xr-x 4 root root 4096 1970-01-01 08:00 odm
drwxr-xr-x 2 root root 0 1970-01-01 08:00 oem
dr-xr-xr-x 260 root root 0 1970-01-01 08:00 proc
drwxr-xr-x 7 root root 4096 1970-01-01 08:00 product
drwx------ 2 root root 0 2021-12-10 20:51 root
drwxr-x--- 2 root root 0 1970-01-01 08:00 sbin
lrwxrwxrwx 1 root root 21 1970-01-01 08:00 sdcard -> /storage/self/primary
drwxr-xr-x 4 root root 80 2015-01-01 08:00 storage
dr-xr-xr-x 12 root root 0 2015-01-01 08:00 sys
drwxr-xr-x 15 root root 4096 1970-01-01 08:00 system
drwxrwxrwt 6 root root 220 2022-07-21 19:27 tmp
-rw-r--r-- 1 root root 5272 1970-01-01 08:00 ueventd.rc
drwxr-xr-x 13 root root 4096 1970-01-01 08:00 vendor
cmcc_jiangsu:/tmp #
我们可以看到开头的十个字符:
第一位一般用来区分是文件还是目录:
d 表示是一个目录
- 表示是一个普通文件
l 表示是一个符号链接文件实际上她指向的是另一个文件
b/c 分别表示区块设备和其她的外围设备是特殊类型的文件
s/p 通常很少见这些文件关系到系统的数据结构和管道
十个位置的含义:
1 文件类型
234 文件所有者
567 群组用户
8910 其她用户
后面六列含义:
目录文件数
用户名
群组名
大小信息
创建时间信息
文件/目录 名以及链接指向
——————————
三种普通权限类型
文件或目录的访问权限分为三种权限:
第二位 可读/r/4
第三位 可写 /w/2
第四位 可执行 /x1
其实是四种权限:
- 没有对应权限
r 读取 read 权限 可以读取文件或者进入目录浏览
w 写入 write 权限 对文件来说是具有修改文件内容的权限 对目录来说是允许删除或移动目录内的文件
x 执行 execute 权限 具有执行文件或者进入目录的权限
——————————
三种用户权限
有三种不同类型的用户可对文件或目录进行访问分别是:
文件所有者 所有者一般是文件的创建者
同组用户 所有者可以允许同组用户是否有权限访问文件
其她用户 所有者可以将文件的权限赋予给系统中的其她用户
每一文件或者目录的访问权限都有三组
每组用三位表示 每一位分别代表文件的读写和执行权限
剩下的九位权限:
2、3、4 表示所有者权限
5、6、7 表示所属用户组权限
8、9、10 是其她用户的权限
如下所示在 Android 根目录下使用 ls -l 命令查看 boot 目录的权限信息:
cmcc_jiangsu:/ # ls -alh | grep boot
drwxr-xr-x 2 root root 0 1970-01-01 08:00 boot
drwxrwxr-x 2 system system 0 2015-01-01 08:00 bootfiles
cmcc_jiangsu:/ #
解释一下 drwxr-xr-x 的含义:
d 表示是一个目录
rwx 表示文件所有者具有读写执行权限
r-x 表示同组用户具有读取和执行权限
r-x 表示其她用户具有读取和执行权限
————————
数字权限
很多时候为了方便编写脚本或者使用终端 就会用数字来表示文件的权限!
读、写、运行三项权限可以用数字表示:
r=4
w=2
x=1
示例解析:
一个文件的权限为
rw-rwx-r-x
代表:
用户具有读写权限 rw- 为 4+2=6
用户组具有读写执行权限 rwx 为 4+2+1=7
其她用户具有读和执行权限 r-x 为 4+1=5
她的数字表示方法就是
675
常用权限组合:
444 = r-- r-- r--
644 = rw- r-- r--
666 = rw- rw- rw-
755 = rwx r-x r-x
777 = rwx rwx rwx
——————————
修改文件权限
可以使用 chmod 修改文件权限 常用来修改脚本和可执行文件的权限:
修改指定文件权限:
chmod 数字权限 文件名
示例:
chmod 777 /tmp/1.txt /* 给该文件最大权限 文件所有者、用户组、其她用户 都具有可读可写可执行权限! */
具体示例都注释了:
cmcc_jiangsu:/ # cd tmp /* 进入临时目录 该目录内容重启系统会清空 */
cmcc_jiangsu:/tmp # pwd /* 查看当前路径 */
/tmp
cmcc_jiangsu:/tmp # ls /* 查看文件内容 */
capture
cmcc_jiangsu:/tmp # touch cd_1.txt /* 创建一个测试文件 */
cmcc_jiangsu:/tmp # ls -l /* 查看所有文件权限 */
total 0
drwxrwxrwt 2 root root 40 2015-01-01 08:00 capture
-rw-rw-rw- 1 root root 0 2022-07-23 15:22 cd_1.txt
cmcc_jiangsu:/tmp # chmod 777 /tmp/cd_1.txt /* 修改测试文件权限为 777 */
cmcc_jiangsu:/tmp # ls -l
total 0
drwxrwxrwt 2 root root 40 2015-01-01 08:00 capture
-rwxrwxrwx 1 root root 0 2022-07-23 15:22 cd_1.txt
cmcc_jiangsu:/tmp #
——————————
三种特殊权限
在 Linux 中除普通权限外还有 3 个特殊权限 SUID/SGID/Sticky
SUID 权限的作用是使文件的执行者拥有文件的所有者的权限
所以修改此权限要慎重
SGID 权限可以作用于目录和文件
Sticky 权限仅对目录有效
这个目录下的文件和目录只有 root 与文件的所有者可以删除
以此达到防止被删除的目的
其中 suid 权限作用于文件属主
sgid 权限作用于属组上
sticky 权限作用于 other/其她 上
%%%%%
suid 权限
让普通用户临时拥有该文件的属主的执行权限
suid 权限只能应用在二进制可执行文件上 也就是命令
而且 suid 权限只能设置在属主位置上
suid 权限使用 s 表示:
chmod u+s 文件 /* 增加权限 */
chmod u-s 文件 /* 移除权限 */
也可以使用数字形式表示 而且是在原权限的数字表达形式开头加 0 或 4
0 表示去除 suid 权限 例如 0755 移除 suid 权限
4 表示添加 suid 权限 例如 4755 添加 suid 权限
示例 具体看注释:
cmcc_jiangsu:/tmp # touch si_1.sh /* 创建测试脚本文件 */
cmcc_jiangsu:/tmp # ls -l si_1.sh /* 查看脚本文件权限 发现默认权限 666 */
-rw-rw-rw- 1 root root 0 2022-07-23 15:27 si_1.sh
cmcc_jiangsu:/tmp # chmod 4666 si_1.sh /* 在 666 权限的基础上添加 suid 权限 */
cmcc_jiangsu:/tmp # ls -l si_1.sh /* 查看脚本权限 */
-rwSrw-rw- 1 root root 0 2022-07-23 15:27 si_1.sh
cmcc_jiangsu:/tmp # chmod 0666 si_1.sh /* 去除 suid 权限 */
cmcc_jiangsu:/tmp # ls -l si_1.sh /* 再次查看权限 */
-rw-rw-rw- 1 root root 0 2022-07-23 15:27 si_1.sh
cmcc_jiangsu:/tmp #
%%%%%
sgid 权限
sgid 权限一般应用在目录上
当一个目录拥有 sgid 权限时任何用户在该目录下创建的文件的属组都会继承该目录的属组
sgid 权限只能作用在属组位置上
sgid 权限也使用 s 表示
增加权限
g+s
移除权限
g-s
sgid 权限也可以使用数字形式表示 而且也是在原权限的数字开头添加
0 表示去除 sgid 权限 例如 0755 移除 sgid 权限
2 表示添加 sgid 权限 例如 2755 添加 sgid 权限
测试 具体都注释了:
cmcc_jiangsu:/tmp # mkdir si_2 /* 创建测试目录 */
cmcc_jiangsu:/tmp # ls -l | grep si_2 /* 查看文件属性 为 777 */
drwxrwxrwx 2 root root 40 2022-07-23 15:33 si_2
cmcc_jiangsu:/tmp # touch si_2/1.txt /* 在测试目录下创建一个文件 */
cmcc_jiangsu:/tmp # ls -l si_2/1.txt /* 查看文件权限为 666 */
-rw-rw-rw- 1 root root 0 2022-07-23 15:34 si_2/1.txt
cmcc_jiangsu:/tmp # chmod 2777 si_2/ /* 为测试目录添加 sgid 权限 */
cmcc_jiangsu:/tmp # ls -l | grep si_2 /* 属组成功置为 s 标志 */
drwxrwsrwx 2 root root 60 2022-07-23 15:34 si_2
cmcc_jiangsu:/tmp # ls -l si_2/1.txt /* 查看刚刚的测试文件权限 没有变化 */
-rw-rw-rw- 1 root root 0 2022-07-23 15:34 si_2/1.txt
cmcc_jiangsu:/tmp # touch si_2/2.txt /* 再次创建一个测试文件 */
cmcc_jiangsu:/tmp # ls -l si_2/2.txt /* 查看文件权限 */
-rw-rw-rw- 1 root root 0 2022-07-23 15:40 si_2/2.txt
cmcc_jiangsu:/tmp # mkdir si_2/siTest /* 在测试目录下再创建一个测试子目录 */
cmcc_jiangsu:/tmp # ls -l si_2 | grep siTest /* 查看测试目录权限 子目录属组与父目录的属组一样 这是因为父目录具有 sgid 权限 */
drwxrwsrwx 2 root root 40 2022-07-23 15:43 siTest
cmcc_jiangsu:/tmp # chmod 0777 si_2/siTest /* 去掉子目录的 sgid 权限 */
cmcc_jiangsu:/tmp # ls -l si_2 | grep siTest /* 查看子目录发现 s 位已经被还原 */
drwxrwxrwx 2 root root 40 2022-07-23 15:43 siTest
cmcc_jiangsu:/tmp # ls -l | grep si_2 /* 父目录并没有被影响 */
drwxrwsrwx 3 root root 100 2022-07-23 15:43 si_2
cmcc_jiangsu:/tmp #
%%%%%
sticky 权限
sticky 权限一般针对目录来设置
作用是只允该目录下的文件的创建者删除自己的创建的文件不允许其她人删除文件 root 用户除外 因为是超级管理员
而且 sticky 权限只能设置在 other 位置上
sticky 权限使用 t 表示
增加权限 o+t
移除权限 o-t
sticky 权限也可以使用数字形式表示 而且是在原数字权限开头加 0 或 1
0 表示去除权限 例如 0755 移除 sticky 权限
1 表示添加权限 例如 1755 添加 sticky 权限
sticky 就不示例了 不过设置 sticky 权限时可能需要使用 -R 参数对目录进行递归操作:
chmod -R 0777 目录
chmod -R 1777 目录