4 votos

Derechos insuficientes para la instalación de npm en Termux en Android

Estoy tratando de instalar un Node.js en una carpeta, por ejemplo, /data/data/com.termux/files/home/storage/shared/documents/projects/code/js/test-npm de Termux en Android 6 rooteado corriendo npm install . La instalación se inicia, pero nunca tiene éxito, arrojando errores y advertencias como npm ERR! cb() never called! y WARN tar EPERM: operation not permitted, futime .

¿Qué permisos debo conceder a npm ¿y cómo?

Actualización 1: intentó correr npm install en /storage/emulated/0/Documents/projects/code/js/test-npm , tiene los mismos errores. Termux tiene permiso de acceso al almacenamiento en el gestor de aplicaciones instaladas de Android.

5voto

Jack Wade Puntos 231

WARN tar EPERM: operation not permitted, futime indica que futime syscall (utilizado para cambiar los tiempos de último acceso y modificación de los archivos) falla con un error: EPERM . Desde utime página de manual 1 :

EPERM ... el UID efectivo de la persona que llama no coincide con el propietario del archivo ...

Esa parece ser la razón del fracaso. Usted está usando la ruta: /data/data/com.termux/files/home/storage/shared/ que en realidad es /sdcard/ 2 (enlace simbólico a /storage/emulated/0/ ). No es un sistema de archivos real, sino un sistema emulado 3 vista del sistema de archivos subyacente ( ext4 o f2fs ). Tiene permisos fijos y no admite muchas características de los sistemas de archivos de Linux, como los enlaces simbólicos y ioctls como FS_IOC_FIEMAP 4 .

Debido a los permisos fijos, todos los directorios y archivos en /sdcard/ son siempre propiedad del usuario root (UID 0 ). Así que al tratar de cambiar la marca de tiempo del archivo, Operation not permitted se devuelve. touch sin embargo, el comando utiliza utimensat 5 que tiene diferentes requisitos de permisos.

Por lo tanto, para evitar este problema, no debe utilizar el sistema de archivos emulado. Termux $HOME está en el directorio ext4 o f2fs , por lo que es un buen lugar para guardar archivos. Utiliza, por ejemplo /data/data/com.termux/files/home/npm-test directorio.

De los comentarios:

Pero, ¿es posible crear de alguna manera un enlace dentro de $HOME a otra ubicación, lo que otorgará todos los derechos que Termux tiene para $HOME para todas las subcarpetas de esta ubicación lejana?

No, no es posible en un teléfono no rooteado. Las aplicaciones sólo pueden escribir en sus directorios privados en el almacenamiento interno (que es /data/data/com.termux para Termux) y en el almacenamiento compartido ( /sdcard/Android/data/com.termux ). Las aplicaciones con Storage el permiso concedido puede leer y escribir en todo el /sdcard/ . No hay ningún otro lugar en el dispositivo donde las aplicaciones puedan guardar archivos 6 . Con SELinux disabled o permissive es posible escribir en un subdirectorio creado (con adb shell ) en /data/local/tmp pero no es el uso previsto de este directorio.


ENLACES:

1 utime página de manual
2 ¿Cómo puedo acceder a $HOME/storage fuera de Termux (con un explorador de archivos)?
3 ¿Qué es? /storage/emulated/0/ ?
4 ¿Cómo puedo hacer un enlace simbólico dentro de /storage/emulated/0 ?
5 ¿Cómo cambiar la fecha de modificación de un archivo sin Root?
6 ¿Dónde almacenan los datos las aplicaciones de Android?

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X