V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bluesky139
V2EX  ›  Android

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

  •  
  •   bluesky139 · 2016-05-24 17:18:51 +08:00 · 12835 次点击
    这是一个创建于 3109 天前的主题,其中的信息可能已经有所发展或是发生改变。

    具体是这样,已 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 纠结了半天没发现哪里有问题。

    32 条回复    2016-05-26 10:17:52 +08:00
    skydiver
        1
    skydiver  
       2016-05-24 17:29:19 +08:00
    /tmp/busybox-arm
    你有这文件么……
    mdzz
        2
    mdzz  
       2016-05-24 17:29:52 +08:00
    1. 还是我见识少,还没发现哪款 Android 手机上 /tmp 目录可用的 :doge:
    2. 到底是 /tmp/busybox 还是 /tmp/busybox-arm ?
    3. 你确定第一句不写 #!/system/bin/sh ?
    pheyx
        3
    pheyx  
       2016-05-24 18:35:05 +08:00 via Android
    看看 SELINUX 是不是启用了,禁用试试(可能得重编译内核)
    bluesky139
        4
    bluesky139  
    OP
       2016-05-24 19:29:35 +08:00
    @skydiver
    @mdzz 手误,是 /tmp/busybox 。
    /tmp 目录可用,我测试的这个手机上,/tmp 是链接到 /data/local/tmp 的。
    第一句改为 #!/system/bin/sh 也没用,我是调用的 busybox 里面的 sh ,总觉得这样也跟第一句没多大关系了。
    bluesky139
        5
    bluesky139  
    OP
       2016-05-24 19:34:47 +08:00
    @pheyx 我先执行 setenforce 0 ,再执行./busybox sh ./i.sh 也一样。
    如果我在 i.sh 里面加上 setenforce 0 ,这一句也会报 permission denied.


    @skydiver
    @mdzz
    @pheyx 一个值得注意的现象是,如果不使用 busybox 里面的 sh ,就可以正常执行,就是直接 sh ./i.sh
    但其实我是想用 busybox 里面的 ash ,结果遇到了这个问题, sh 和 ash 的表现一样。
    pheyx
        6
    pheyx  
       2016-05-24 20:33:19 +08:00 via Android
    @bluesky139 执行完 setenforce 0 之后 getenforce 返回什么? setenforce 在某些版本的 android 会静默失败
    bluesky139
        7
    bluesky139  
    OP
       2016-05-24 20:45:53 +08:00
    @pheyx 返回 0 ,没有任何输出,看起来像是对的。如果是在非 root 下执行,会提示 permission denied ,所以 ROOT 下我觉得应该是成功了的。
    bluesky139
        8
    bluesky139  
    OP
       2016-05-24 20:48:38 +08:00
    @pheyx 我执行 getenforce 返回的是 Permissive ,似乎没有问题。
    ghw
        9
    ghw  
       2016-05-24 20:52:36 +08:00
    这样呢?
    #!/bin/sh echo aa &&/bin/sh /tmp/busybox-arm dirname
    bluesky139
        10
    bluesky139  
    OP
       2016-05-24 21:14:00 +08:00
    @ghw 这样又变成了 ./i.sh: line 3: /bin/sh: Permission denied
    ghw
        11
    ghw  
       2016-05-24 21:16:12 +08:00
    @bluesky139 你这东分两行写也会这样麽
    bluesky139
        12
    bluesky139  
    OP
       2016-05-24 21:19:50 +08:00
    @ghw 用 && 连成一行也一样。
    ghw
        13
    ghw  
       2016-05-24 21:31:32 +08:00
    尴尬。。原来你本来就是三行的。。。
    我还以为是一行

    ; dirname 先执行呢,后一个也会挂麽。。哎。。。

    #!/system/bin/sh
    /tmp/busybox-arm dirname
    echo aa
    bluesky139
        14
    bluesky139  
    OP
       2016-05-24 21:43:47 +08:00
    @ghw 这跟执行先后顺序没关系吧,我试了下,也一样。话说 V2EX 上换行有什么特殊的符号,我直接换行结果发出来就连在一行上了。
    extreme
        15
    extreme  
       2016-05-24 21:58:42 +08:00
    只能慢慢排除,先把 /tmp/busybox-arm 弄到其他路径看看能不能执行。
    LoliconInside
        16
    LoliconInside  
       2016-05-24 22:05:07 +08:00
    为什么总觉得是$PATH 的问题
    fcicq
        17
    fcicq  
       2016-05-24 22:22:35 +08:00   ❤️ 1
    上 strace 记录先
    julyclyde
        18
    julyclyde  
       2016-05-24 22:26:12 +08:00
    tmp 是不是 mounted with noexec 了?
    ProfFan
        19
    ProfFan  
       2016-05-24 22:26:28 +08:00
    同意楼上,先看崩哪儿了
    bluesky139
        20
    bluesky139  
    OP
       2016-05-25 10:15:01 +08:00
    @LoliconInside $PATH 可能会是什么问题,这里 $PATH 输出 /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin ,如果我在脚本里先把 PATH 清空再执行也一样。
    bluesky139
        21
    bluesky139  
    OP
       2016-05-25 10:18:46 +08:00
    @julyclyde tmp 有可执行权限( 777 ),仔细看,我是用 busybox 里的 sh 去执行脚本,脚本里面再调用 busybox ,如果没有可执行权限,那脚本根本不会执行。
    bluesky139
        22
    bluesky139  
    OP
       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
        23
    bluesky139  
    OP
       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
        24
    julyclyde  
       2016-05-25 14:07:53 +08:00
    为什么 execvc 的路径不是 /tmp 开头的?
    bluesky139
        25
    bluesky139  
    OP
       2016-05-25 14:54:22 +08:00
    @julyclyde 这个机器上 /tmp 是连到 /data/local/tmp 下的。
    fcicq
        26
    fcicq  
       2016-05-25 16:49:11 +08:00   ❤️ 1
    根据 strace 结果猜一下的话, 应该是 fork 出的 /bin/sh 不能再执行 /data 分区下的内容. 感觉和 selinux 的 domain 设置有关.
    extreme
        27
    extreme  
       2016-05-25 17:23:03 +08:00
    @bluesky139 那不执行 /tmp/下的 busybox 呢,执行其他可执行文件。
    extreme
        28
    extreme  
       2016-05-25 17:23:37 +08:00
    @bluesky139 我意思是执行 /tmp/下的其他可执行文件。
    bluesky139
        29
    bluesky139  
    OP
       2016-05-25 18:07:22 +08:00
    @extreme 从脚本里调用 /tmp 下面的其它可执行文件也不行。
    我发现,如果把 busybox 放到 /system 下面,再在脚本里调用 /tmp 下面的可执行文件没有问题。
    bluesky139
        30
    bluesky139  
    OP
       2016-05-25 18:08:04 +08:00
    @fcicq 有什么解么?
    extreme
        31
    extreme  
       2016-05-25 21:02:08 +08:00
    @bluesky139 分别对 /system 和 /tmp 里面的 busybox 执行 ls -lZ 看看。
    bluesky139
        32
    bluesky139  
    OP
       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 也没用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:51 · PVG 03:51 · LAX 11:51 · JFK 14:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.