gpt4 book ai didi

Android(Linux) 的 mount(8) 通过本地 shell 和 adb 影响不同的进程

转载 作者:太空宇宙 更新时间:2023-11-04 12:13:30 24 4
gpt4 key购买 nike

我想通过encfs创建一个加密文件系统(Android的FDE或FBE不能加密单个目录),但是当我通过本地shell(JuiceSSH)执行命令时它不能正常工作:
encfs --no-default-flags --public --stdinpass/data/home/MediaStore-e/data/media/0/MediaStore -- -o uid=1023,gid=1023,umask=002 #1023是 media_rw 的 ID
只有 JuiceSSH 可以访问我想要的/data/media/0/MediaStore 而不是旧目录(换句话说,真正的 MediaStore)。而其他应用程序(不仅是 Java 应用程序,还有 adb 等)不认为它是一个挂载点:
亚行外壳
shell@oneplus3:/$ su
shell@oneplus3:/# 挂载点/data/media/0/MediaStore
shell@oneplus3:/#/data/media/0/MediaStore 不是挂载点
在本地 shell(JuiceSSH)中:
oneplus3 ~ # 挂载点/data/media/0/MediaStore
oneplus3 ~ #/data/media/0/MediaStore 是挂载点

而/system/bin/sdcard(提供/storage/emulated/的应用程序)无法访问它,所以我无法从/storage/emulated/0/MediaStore读取我的数据。但是如果我通过 adb 执行上面的命令,它会运行良好。我使用这个脚本来查找知道该目录是挂载点的进程:
for dir in/proc/*;do
如果 [ -e $dir/mounts ]; 那么
如果 grep -q MediaStore $dir/mounts;那么
猫$目录/命令行
回声


完成

当我运行 encfs --no-default-flags --public --stdinpass/data/home/MediaStore-e/data/media/0/MediaStore -- -o uid=1023,gid=1023,umask= 002 通过本地 shell,脚本打印如下:
com.sonelli.juicessh
/data/user/0/com.sonelli.juicessh/files/bin/arm/pie/bash--rcfile/data/user/0/com.sonelli.juicessh/files/share/bashrc
su0-c/data/data/com.sonelli.juicessh/files/bin/arm/pie/bash--rcfile/data/home/.bashrc
/data/data/com.sonelli.juicessh/files/bin/arm/pie/bash--rcfile/data/home/.bashrc
/data/bin/encfs--no-default-flags--public--stdinpass/data/home/MediaStore-e/data/media/0/MediaStore---ouid=1023,gid=1023,umask=002
当我通过 adb 执行此操作时,它打印了太多行,我无法将它们放在这里,但几乎所有进程都在其中。其他应用程序(如音乐播放器)可以访问我想要的数据。adb shell 和本地 shell 以相同的用户和组运行,并拥有相同的安全上下文 (u:r:su:s0),我什至尝试清除环境变量,并且 setenforce 0,我得到了和以前一样的结果。我该如何修复它?我无法在每次重新启动时使用 adb 来执行此操作。

最佳答案

我已经自己解决了这个问题,所以我回答自己的问题来分享我的解决方案。这就是为什么其他进程无法访问我想要的挂载树的原因,而不是它们位于不同的挂载命名空间中。ADB 的命名空间与 /sbin/init 相同,但 JuiceSSH(或创建的其他终端应用程序by zygote64) 位于另一个由 clone(2) 创建的挂载命名空间中,因此您无法通过其他应用程序访问挂载树,即使是 root。解决方案:1.如果你的 su 支持 --mount-master 选项,就使用它。2.编写一个 shell 脚本,在启动时由/system/bin/sysinit * 执行,因此它与 init(1) 在相同的挂载命名空间中。它从一个 FIFO 中读取命令并执行它。它是这样的:
#!/系统/bin/sh
mknod/data/.global_fifo p
虽然真实;做
评估“$(猫/数据/.global_fifo)”
完毕
不要忘记为其设置正确的模式和安全上下文。

  • sysinit 是一个应用程序,它执行/system/etc/init.d/* 就像大多数 linux 发行版一样,它安装在 cyanogenmod 13.0 上。您可以自己编写一个并将其添加到/init.rc 中。)

关于Android(Linux) 的 mount(8) 通过本地 shell 和 adb 影响不同的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48128738/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com