首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash/mksh的Android实现中的文档/字符串问题

bash/mksh的Android实现中的文档/字符串问题
EN

Stack Overflow用户
提问于 2014-11-27 06:48:02
回答 1查看 508关注 0票数 2

我在进程替换方面遇到了几个问题,这里是Android上bash和mksh中的docs/string。

bash中的进程替换对于特权用户和非特权用户都失败。

代码语言:javascript
复制
$ cat < <(ls)
bash: /dev/fd/62: No such file or directory

bash的手册页指出:

在支持命名管道(FIFO)或命名打开文件的/dev/fd方法的系统上,支持进程替换。

Android缺少/dev/fd,但是我们可以通过以su形式运行以下命令(或者将其放在userinit.d中,以便在引导时运行)来解决这个问题:

代码语言:javascript
复制
ln -s /proc/self/fd /dev/fd

mksh中不支持这种进程替换,但是我们可以通过使用命名管道、文件描述符和这里的docs/string来解决这个问题。在这里,docs/string在bash和mksh中运行良好,同时作为root/su运行。

以下是问题所在:在bash和mksh中,对于非特权用户来说,文档/字符串都失败了。

代码语言:javascript
复制
$ cat <<< "string"
bash: cannot create temp file for here-document: Permission denied

$ cat <<< "string"
/system/bin/sh: can't create temporary file /data/local/sh5debnv.tmp: Permission denied

很明显,shell缺乏对合适的/tmp文件夹的访问。似乎涉及shell变量TMPDIR。

我临时修改了bashrc/mkshrc文件,以将TMPDIR设置为/data中的$USER != $USER中的一个全局可写目录。当从亚行/终端运行脚本时,这个功能很好,但似乎是一个草率和潜在危险的想法。例如,将TMPDIR设置为/sdcard时,从‘Android终端仿真器’调用脚本时工作正常,但在其他地方失败。

我还希望脚本在从非特权、非交互式shell(即Tasker或其他应用程序)调用时能够可靠地工作。是否有人对将TMPDIR设置为什么、从何处设置TMPDIR(即mkshrc/bashrc、userinit.d或repack init.rc)或一些全新的解决方案有任何建议?

EN

回答 1

Stack Overflow用户

发布于 2014-11-27 07:18:10

你已经回答了你的问题了。不过,这些都是好问题。mksh(Android官方外壳)的创建者和维护者mirabilos不久前表示,TMPDIR之所以不存在是出于安全原因,但这是谷歌和他试图解决的问题。

至于在哪里创建临时目录,我将在/sdcard中实现,因为这对于非根进程是可访问的。这是我在我的/system/etc/mkshrc和/system/etc/bash/bashrc中使用的函数,在Android中是mkshrc和bashrc的位置:

代码语言:javascript
复制
mktmp3(){
  [[ -e $TMPDIR ]] && [[ -w $TMPDIR ]] && return 0 || :

  [[ -e /sdcard ]] || {
    [[ -e /storage/emulated/0 ]] && ln -sf /storage/emulated/0 /sdcard
    }

  (( $USER_ID )) && {
    export TMPDIR=/sdcard/.tmp/$RANDOM
    mkdir -p $TMPDIR 2>/dev/null
  } || :

  (( $USER_ID )) || {
    busybox mount -o rw,remount /
    mkdir -p /tmp 2>/dev/null
    busybox mount -o ro,remount /
    busybox mount -t tmpfs -o rw /tmp /tmp
    export TMPDIR=/tmp/$RANDOM
    mkdir -p $TMPDIR 2>/dev/null
  }
}

mktmp3

这将为随机生成的root和非root用户提供一个相当安全的临时目录。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27164614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档