busybox sh ./i.sh,执行到某一句的时候提示 permission denied,但手动执行那一句没有问题。

2016-05-24 17:18:51 +08:00
 bluesky139

具体是这样,已 ROOT 的 Android 手机上,我放了个 busybox 到 /tmp 目录下。 切到 /tmp , chmod 777 busybox, 可以执行。 执行./busybox dirname 或 ./busybox echo aa 都没有问题。

这时写个脚本 i.sh ,放到 /tmp 下,内容就 3 句: #!/bin/sh echo aa /tmp/busybox-arm dirname

然后执行 ./busybox sh ./i.sh 执行到第 3 句提示 ./i.sh: line 3: /tmp/busybox-arm: Permission denied 纠结了半天没发现哪里有问题。

9053 次点击
所在节点    Android
32 条回复
bluesky139
2016-05-25 10:18:46 +08:00
@julyclyde tmp 有可执行权限( 777 ),仔细看,我是用 busybox 里的 sh 去执行脚本,脚本里面再调用 busybox ,如果没有可执行权限,那脚本根本不会执行。
bluesky139
2016-05-25 11:41:21 +08:00
@extreme 结果发现,把 busybox 放到 /system 下就没问题了,然而也不知道是什么原因。
看 /system 和 /data 的 mount 参数也没发现什么问题。
一个是 /system ext4 rw,seclabel,relatime,data=ordered 0 0
另一个是 /data ext4 rw,seclabel,nosuid,nodev,noatime,discard,journal_checksum,journal_async_commit,noauto_da_alloc,data=ordered 0 0
bluesky139
2016-05-25 12:11:38 +08:00
@fcicq strace 的结果:

read(10, "#!/bin/sh\necho aa \n/data/local/t"..., 1023) = 55
wait4(-1, 0xbeb930f8, WNOHANG, NULL) = -1 ECHILD (No child processes)
write(1, "aa\n", 3aa
) = 3
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, chil
d_tidptr=0x112c598) = 18286
wait4(-1, Process 18286 attached
<unfinished ...>
[pid 18286] close(10) = 0
[pid 18286] rt_sigaction(SIGQUIT, {SIG_DFL, ~[], 0x4000000 /* SA_??? */}, NULL,
8) = 0
[pid 18286] execve("/data/local/tmp/busybox-arm", ["/data/local/tmp/busybox-arm"
, "dirname"], [/* 29 vars */]) = -1 EACCES (Permission denied)
julyclyde
2016-05-25 14:07:53 +08:00
为什么 execvc 的路径不是 /tmp 开头的?
bluesky139
2016-05-25 14:54:22 +08:00
@julyclyde 这个机器上 /tmp 是连到 /data/local/tmp 下的。
fcicq
2016-05-25 16:49:11 +08:00
根据 strace 结果猜一下的话, 应该是 fork 出的 /bin/sh 不能再执行 /data 分区下的内容. 感觉和 selinux 的 domain 设置有关.
extreme
2016-05-25 17:23:03 +08:00
@bluesky139 那不执行 /tmp/下的 busybox 呢,执行其他可执行文件。
extreme
2016-05-25 17:23:37 +08:00
@bluesky139 我意思是执行 /tmp/下的其他可执行文件。
bluesky139
2016-05-25 18:07:22 +08:00
@extreme 从脚本里调用 /tmp 下面的其它可执行文件也不行。
我发现,如果把 busybox 放到 /system 下面,再在脚本里调用 /tmp 下面的可执行文件没有问题。
bluesky139
2016-05-25 18:08:04 +08:00
@fcicq 有什么解么?
extreme
2016-05-25 21:02:08 +08:00
@bluesky139 分别对 /system 和 /tmp 里面的 busybox 执行 ls -lZ 看看。
bluesky139
2016-05-26 10:17:52 +08:00
@extreme
/tmp 下面 -rwxrwxrwx root root u:object_r:shell_data_file:s0 busybox
/system 下面 -rwxrwxrwx root root u:object_r:system_file:s0 busybox
然而我把 /tmp 下面的 busybox 改为 u:object_r:system_file:s0 也没用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/280954

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX