bash / mksh的Android实现中的docs / strings问题

时间:2014-11-27 06:48:03

标签: android bash shell adb cyanogenmod

我在Android上的bash和mksh shell中遇到了流程替换以及docs / strings的几个问题。

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

$ cat < <(ls)
bash: /dev/fd/62: No such file or directory

bash的手册页指出:

  

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

Android缺少/ dev / fd但是我们可以通过运行以下命令作为su(或将其放在userinit.d中以便在启动时运行)来解决此问题:

ln -s /proc/self/fd /dev/fd

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

这就是问题所在:这里的文档/字符串在bash和mksh中都没有特权用户

$ 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设置为[$ USER!= root]的/ data中的全局可写目录。这在从adb / terminal运行脚本时运行良好,但看起来像是一个草率且有潜在危险的想法。例如,将TMPDIR设置为/ sdcard在从“Terminal Emulator for Android”调用脚本时工作正常,但在其他地方失败。

我还希望脚本在从无特权的非交互式shell(即Tasker或其他应用程序)调用时可靠地运行。有没有人有什么建议设置TMPDIR,从哪里设置它(即mkshrc / bashrc,userinit.d或repack init.rc),或者一些全新的解决方案?

1 个答案:

答案 0 :(得分:1)

你在这里几乎回答了你的问题。这些是一些很好的问题。 mirabilos,mksh的创建者和维护者(Android的官方shell),前段时间说TMPDIR的原因不是出于安全原因,而是谷歌和他正试图解决的问题。

至于创建临时目录的位置,我会在/ sdcard中创建它,因为非root进程可以访问它。这是我在/ system / etc / mkshrc和/ system / etc / bash / bashrc中使用的函数,Android中mkshrc和bashrc的位置:

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和non-root创建一个相当安全的临时目录。