【问题标题】:Can't push files to device无法将文件推送到设备
【发布时间】:2017-11-10 01:35:11
【问题描述】:

我正在使用adb 在安卓设备上推送和拉取文件。 这些文件是我们的应用程序的配置和数据,在受限用户帐户上安装和使用。

设备用户主目录中有一个特殊的交换文件夹。 一个典型的文件夹布局(android 6+)如下:

/storage/emulated/0             // home dir of main device user

/storage/emulated/10            // home dir of restricted user
/storage/emulated/10/exchange   // our file exchange dir

最近我们发现在运行 Android 6.0.1 的 Samsung Galaxy Tab S 上无法进行文件交换。

// Pushing to main user works just fine
$ ./adb push barfoo.txt /storage/emulated/0
[   ?] /storage/emulated/0/barfoo.txt: 0/?

// Pushing to restricted user does not work
$ ./adb push barfoo.txt /storage/emulated/10
adb: error: failed to copy 'barfoo.txt' to '/storage/emulated/10/barfoo.txt': Permission denied

在logcat的输出中我发现了以下线索:

audit   : type=1400 msg=audit(1496849979.822:280): avc:  denied  { write } for  pid=15762 comm="adbd" name="10" dev="sdcardfs" ino=130656 scontext=u:r:adbd:s0 tcontext=u:object_r:container_app_data_backend:s0:c522,c768 tclass=dir
audit   :  SEPF_SECMOBILE_6.0.1_0021
audit   : type=1300 msg=audit(1496849979.822:280): arch=40000028 syscall=322 per=800008 success=no exit=-13 a0=ffffff9c a1=b6bc0fc8 a2=a00c1 a3=1b6 items=1 ppid=1 ppcomm=init pid=15762 auid=4294967295 uid=2000 gid=2000 euid=2000 suid=2000 fsuid=2000 egid=2000 sgid=2000 fsgid=2000 tty=(none) ses=4294967295 comm="adbd" exe="/sbin/adbd" subj=u:r:adbd:s0 key=(null)
audit   : type=1307 msg=audit(1496849979.822:280):  cwd="/"
audit   : type=1302 msg=audit(1496849979.822:280): item=0 name="/storage/emulated/10/barfoo.txt" inode=130656 dev=00:17 mode=040771 ouid=0 ogid=1015 rdev=00:00 obj=u:object_r:container_app_data_backend:s0:c522,c768
audit   : type=1327 msg=audit(1496849979.822:280): proctitle=2F7362696E2F61646264002D2D726F6F745F7365636C6162656C3D753A723A73753A7330
audit   : type=1320 msg=audit(1496849979.822:280): 

据我所知,有一些 SELinux 政策强制执行,阻止我推送文件。

有人能复制吗?有没有办法放松 SELinux 政策?您将如何交换文件?

【问题讨论】:

  • 你试过用root推送吗?
  • 我该怎么做? sudo ./adb push ... 没有任何区别。设备本身没有root。是否可以像通过 adb 调用意图一样以特定设备用户身份运行 adb push
  • 如果有root访问选项,请检查开发者选项。
  • 谢谢。不幸的是,开发人员设置中没有这样的选项。 USB 调试已启用,调试授权已清除,我的机器已获得授权。 USB 模式设置为 MTP。 Mac 的 AndroidFileTransfer 应用程序使我能够将文件拖放到所需的文件夹中。也许我们应该通过 MTP 来实现我们的文件传输。
  • @lupz 我使用 adb 脚本将文件复制到我的设备,特别是因为我的 MTP 连接似乎阻止了我一半时间复制文件。

标签: android adb selinux


【解决方案1】:

您通过AndroidFileTransfer看到的文件实际上不在您尝试推送的路径中。

试试adb push barfoo.txt sdcard/

如果您使用adb shellcd sdcard,我敢打赌您可以看到您在AndroidFileTransfer 中看到的相同文件。这是因为它们实际上是符号链接,尽管您本身没有 sdcard,但这是使用的目录名称。

【讨论】:

  • 谢谢。我试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多