我在进程替换方面遇到了几个问题,这里是Android上bash和mksh中的docs/string。
bash中的进程替换对于特权用户和非特权用户都失败。
$ cat < <(ls)
bash: /dev/fd/62: No such file or directorybash的手册页指出:
在支持命名管道(FIFO)或命名打开文件的/dev/fd方法的系统上,支持进程替换。
Android缺少/dev/fd,但是我们可以通过以su形式运行以下命令(或者将其放在userinit.d中,以便在引导时运行)来解决这个问题:
ln -s /proc/self/fd /dev/fdmksh中不支持这种进程替换,但是我们可以通过使用命名管道、文件描述符和这里的docs/string来解决这个问题。在这里,docs/string在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设置为/data中的$USER != $USER中的一个全局可写目录。当从亚行/终端运行脚本时,这个功能很好,但似乎是一个草率和潜在危险的想法。例如,将TMPDIR设置为/sdcard时,从‘Android终端仿真器’调用脚本时工作正常,但在其他地方失败。
我还希望脚本在从非特权、非交互式shell(即Tasker或其他应用程序)调用时能够可靠地工作。是否有人对将TMPDIR设置为什么、从何处设置TMPDIR(即mkshrc/bashrc、userinit.d或repack init.rc)或一些全新的解决方案有任何建议?
发布于 2014-11-27 07:18:10
你已经回答了你的问题了。不过,这些都是好问题。mksh(Android官方外壳)的创建者和维护者mirabilos不久前表示,TMPDIR之所以不存在是出于安全原因,但这是谷歌和他试图解决的问题。
至于在哪里创建临时目录,我将在/sdcard中实现,因为这对于非根进程是可访问的。这是我在我的/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和非root用户提供一个相当安全的临时目录。
https://stackoverflow.com/questions/27164614
复制相似问题