busybox sh ./i.sh,执行到某一句的时候提示 permission denied,但手动执行那一句没有问题。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
bluesky139
V2EX    Android

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

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

    具体是这样,已 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 在某些版本的 anroid 会静默失败
    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     Solana     5126 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 07:15 PVG 15:15 LAX 23:15 JFK 02:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86