Android中 在目录下创建文件的权限添加 流程

Android中读写目录涉及到的权限一般有三个,一个是selinux, 另一个是用户组, 还有一个是目录本身权限问题,本文章针对这三点做详细解析

目录

[一: Selinux权限问题](#一: Selinux权限问题)

[1: 先查看进程SSSPID的标签](#1: 先查看进程SSSPID的标签)

[2: 再查看要访问的目录的标签](#2: 再查看要访问的目录的标签)

[二: 被访问目录本身权限问题](#二: 被访问目录本身权限问题)

[三: 用户组权限问题](#三: 用户组权限问题)


一: Selinux权限问题

假设目录为/mnt/vendor/, 进程SSSPID需要在这个目录下创建一个文件,名为newfile

那这个流程应该是,SSSPID进程先search /mnt/vendor目录,再open /mnt/vendor/目录,open一般伴有的权限是getattr, 然后再在这个目录下创建一个新文件newfile,那SSSPID需要对/mnt/vendor/目录拥有创建文件的权限,创建文件的权限一般是SSSPID先拥有对mnt/vendor这个目录即dir进行 read write add_name remove_name的权限,然后再在在这个目录下创建文件,即对file拥有create append open getattr ioctl setattr read write unlink的权限

怎么加权限呢?那要先知道进程SSSPID的标签是什么,再知道要访问的目录的标签是什么

1: 先查看进程SSSPID的标签

cpp 复制代码
adb shell
ps -A -Z| grep SSSPID

然后回车,一般输出内容如下,那么SSSPIDSelinux就是SSSPID进程的标签

cpp 复制代码
u:r:SSSPIDSelinux:s0  ystem   1020     1   27016   4432 0     0 S SSSPIDservice

2: 再查看要访问的目录的标签

cpp 复制代码
adb shell
cd mnt
ls -l -Z

然后回车,结果如下,那么mnt/vendor 的标签就是mnt_vendor_file

cpp 复制代码
drwxr-x---  3 root   media_rw         u:object_r:mnt_user_file:s0            60 1970-01-08 04:57 user
drwxr-xr-x  7 root   root             u:object_r:mnt_vendor_file:s0         140 1970-01-08 04:57 vendor
...

如果遇到以下这种情况的话,也就是很多信息用?表示,那说明普通用户对此目录没有权限访问,需要执行adb root,再去查看标签,即可获取标签信息

cpp 复制代码
drwxr-x---  3 root   media_rw u:object_r:mnt_user_file:s0       60 1970-01-08 04:57 user
d?????????  ? ?      ?        ?                                  ?                ? vendor

3: 添加Selinux权限

好,目前看,主体和客体的Selinux信息我们都知道了,主体即SSSPIDSelinux,客体即mnt_vendor_file,那我们就可以愉快的加标签了

cpp 复制代码
allow SSSPIDSelinux mnt_vendor_file:dir { read write open add_name getattr search remove_name };
allow SSSPIDSelinux mnt_vendor_file:file { create append open getattr ioctl setattr read write unlink };

其他目录也是一样的方法

二: 被访问目录本身权限问题

要查看被访问目录本身的权限,我们要看一下如果我们的用户组和被访问目录的不一致的时候,能否访问,这个怎么看呢,通过adb也可以看出来,如下

cpp 复制代码
adb shell
cd mnt
ls -l
drwxr-x---  3 root   media_rw           60 1970-01-08 04:57 user
drwxr-xr-x  7 root   root              140 1970-01-08 04:57 vendor

看到mnt/vendor 目录的权限是drwxr-xr-x

mnt/vendor目录权限说明:

|---------|--------------------------|-------------------------|-------------------------|
| d | rwx | r-x | r-x |
| 代表这是个目录 | 和本进程同user,同group的可读可写可执行 | 和本进程不同user,同group的可读可执行 | 和本进程同user,不同group的可读可执行 |

可以临时修改mnt/vendor的目录权限,使其他用户组用户可读可写权限,命令如下

cpp 复制代码
adb shell
cd mnt
chmod 777 vendor
ls -l
drwxrwxrwx  7 root   root              140 1970-01-08 04:57 vendor

但这个目录的权限一般不能随便改,所以建议不改此处,那怎么修改我们的权限呢,紧接着就到了下一节-用户组权限问题,修改这个地方就可以解决这个问题

三: 用户组权限问题

这个问题一般是进程与要访问的进程不在一个用户组里导致的,比如你的进程如果属于system用户组,你是不能访问用户组是root的文件的,这个怎么查看呢,可以在你的rc文件中查看,例如下:

cpp 复制代码
service SSSPID /system/bin/SSSPID
    class core
    user system
    group system
    oneshot

那可以看到, SSSPID的user是system,group也是system, 我们再check一下mnt/vendor 的用户组是什么

cpp 复制代码
adb shell
cd mnt
ls -l
drwxr-x---  3 root   media_rw           60 1970-01-08 04:57 user
drwxr-xr-x  7 root   root              140 1970-01-08 04:57 vendor

由上图可以看到mnt/vendor 的用户user是root,group是root,那如果现在SSSPID要在mnt/vendor下创建文件那是不可能的,这时候如果看log是没有异常输出的,但可以在SSSPID中用Access函数去看一下SSSPID进程有没有权限去read和write这个目录,答案是有read,但无法write,那我们就需要改一下SSSPID进程的用户组了,修改为如下重新push进机器即可

cpp 复制代码
service SSSPID /system/bin/SSSPID
    class core
    user root
    group system root
    oneshot
相关推荐
捕鲸叉4 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
青花瓷5 小时前
C++__XCode工程中Debug版本库向Release版本库的切换
c++·xcode
幺零九零零7 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
捕鲸叉7 小时前
MVC(Model-View-Controller)模式概述
开发语言·c++·设计模式
Dola_Pan8 小时前
C++算法和竞赛:哈希算法、动态规划DP算法、贪心算法、博弈算法
c++·算法·哈希算法
yanlou2338 小时前
KMP算法,next数组详解(c++)
开发语言·c++·kmp算法
小林熬夜学编程8 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
阿洵Rain8 小时前
【C++】哈希
数据结构·c++·算法·list·哈希算法