¿Ejecutar el comando de shell descargado sin root?

Mi teléfono es un Galaxy S3, no rooteado . Tengo instalados "ES File Explorer" y "Terminal Emulator".

Descargué una compilación de Android de 'wget', con la intención de ejecutarla desde la aplicación Terminal Emulator. El archivo existe actualmente /storage/sdcard0/Download(que es una partición interna, no una tarjeta SD física) como:

-rw-rw-r-- root sdcard_rw 241974 2016-03-11 wget

./wgetda Permiso denegado. chmod o+x wgetda "modo malo"; esto aparentemente se debe a que Android chmodsolo acepta dígitos octales; chmod 665 wgetda "Operación no permitida". Puedo copiar el archivo con "cp", por lo que se puede escribir en el sistema de archivos.

Otras preguntas y respuestas aquí brindan varias razones posibles para chmodfallar en Android. Una son las tarjetas SD formateadas con FAT que no admiten bits de permiso; pero como digo esto no es en realidad una tarjeta SD. Otro es el sistema de archivos que se monta con "noexec". Mi conocimiento de Android/Linux es demasiado escaso para verificar tales cosas.

¿Android me impide ejecutar wget por diseño? ¿Hay alguna manera de ejecutarlo sin rootear mi teléfono?

Use el shcomando antes de invocar su script. Consulte aquí: Permisos de secuencias de comandos de Shell para entusiastas de Android
@Chungzuwalla: si desea el comando wget sin rootear, es posible que le interese esta versión de wget de busybox .
Gracias @AaronGillion, intenté usar shpero como wget es un binario, solo da un error de sintaxis. Parece que lo que @MatijaNalis escribió a continuación sobre esto es correcto.
Cópielo en la carpeta de su aplicación de terminal y luego podrá ejecutarlo.

Respuestas (3)

Sí, esto es por diseño. No puede ejecutar archivos binarios desde la tarjeta SD sin privilegios de sistema o superusuario (y volver a montarlos sin la noexecopción) porque, de lo contrario, las aplicaciones podrían simplemente descargar y ejecutar código malicioso a voluntad. En versiones anteriores de Android, la tarjeta SD tampoco tenía permisos emulados, por lo chmodque, naturalmente, fallaría.

Algunos dispositivos/versiones anteriores de Android pueden permitir la ejecución desde /data/local/tmp/, por lo que podría intentar colocarlo allí. De lo contrario, probablemente necesitará root.

¡Gracias! Esperaba que fuera el sistema de permisos de la aplicación el que controlara lo que una aplicación podía hacer, por lo que descargar y ejecutar el código estaría bien si no requiriera ningún privilegio por encima de lo que ya tiene la aplicación. De todos modos no tengo /localnada, o al menos no puedo verlo. Creo que la estructura de los sistemas de archivos UN*X seguirá siendo un misterio para mí durante mucho tiempo.
Sin embargo, las aplicaciones pueden ejecutar sus propios binarios. Desde que instaló la aplicación de terminal, se puede ejecutar cualquier binario de esta aplicación. Por lo tanto, copie el binario en la carpeta de la aplicación de la terminal y podrá ejecutarlo desde allí. Lo probé, funciona.
@TJJ ¡Eso es inteligente!
Pero sí, según tengo entendido, se limitará a los permisos de la aplicación 'principal', es decir, la aplicación de terminal. Solicita permiso de Internet, por lo que wget funcionará. Es posible que cosas más sofisticadas no. Otra opción es escribir su propia aplicación con todos los permisos necesarios (afaik Terminal Emulator es de código abierto en github).

Android, al igual que Linux, impide que cualquier usuario, excepto root, cambie los bits de permiso de cualquier archivo que no sea propiedad de dicho usuario. Dicho esto, chmod no es efectivo, a menos que tenga privilegios de root.

Por cierto, incluso si tuviera tales privilegios, no habría podido cambiar los permisos, siempre que la ruta de destino sea /storage/sdcard0 o /storage/emulated/0 . Esto depende de una política de seguridad, que se implementa en la forma del sistema de archivos FUSE , y se puede eludir moviéndose a /data/media/0 o /data/media/ emulated/0 y modificando el archivo desde esta posición. Tenga en cuenta que este procedimiento le permitirá ejecutar un script solo si lo inicia desde una de las ubicaciones mencionadas anteriormente.

Por último, debe tenerse en cuenta que el puerto de Android de chmod no admite la edición simbólica de las banderas ( +rwxy así sucesivamente), por lo que se verá obligado a editarlas a través de sus valores octales correspondientes. También necesitará privilegios de root para poder acceder a /data/media . Intentar acceder cda dicho directorio mediante el uso de privilegios de usuario da como resultado un error de Permiso denegado .

Creo que aquí es donde realmente me confundo. Entonces, cuando descargué el binario wget (usando algún navegador, no recuerdo cuál ahora) se guardó como propiedad de root. Si lo copio cpen Terminal Emulator, la copia también es propiedad de root. Puedo borrar la copia. Pero el shell de Terminal Emulator no es un shell raíz. Hay mucho sobre esto que me confunde. Pero esa es otra pregunta...
@Chungzuwalla Copiar un archivo es una operación generalmente permitida, siempre que el archivo a copiar no esté bloqueado (como /etc/shadow en Linux). Cambiar permisos, sin embargo, es una operación peligrosa, ya que, si es perpetrada por algún usuario que no es de confianza, puede prohibir el acceso a casi cualquier archivo ( chmod 000).
  • primero, para hacer que el archivo sea ejecutable, debe hacer chmod 775 wget(y no 665)
  • pero solo puede cambiar los modos del archivo si es su propietario (o raíz). En tu caso, el propietario es root(y el grupo sdcard_rw, como lo indica tu ls -l), por lo que solo rootpuedes cambiar los permisos. Como no es root (puede verificar con idel comando, pero como dice que no tiene un dispositivo rooteado, por lo que no puede usarlo supara convertirse en root), no puede cambiar sus permisos.
  • Además, los modos solo se pueden cambiar si el sistema de archivos que contiene el archivo admite permisos UN*X. Probablemente /storage/sdcard0/Downloadsea FAT, que no lo admite (puede verificar el tipo de sistema de archivos con cat /proc/mounts)

Habiendo dicho todo eso, si el archivo fuera un script de shell, podría ejecutarlo incluso con el xmodo faltante con sh /storage/sdcard0/Download/script.

Pero si es binario ELF (como es el caso con su wget), probablemente no tenga suerte en Android (en el sistema GNU/Linux de escritorio, puede ejecutar binarios ELF indirectamente a través del enlazador dinámico /lib64/ld-linux-x86-64.so.2 /mnt/Download/wget, pero no creo que Android permita lo mismo con su /system/bin/linker- aunque podría estar equivocado en eso)