4 votes

Droits insuffisants pour npm install dans Termux sur Android

Je tente d'installer un module Node.js dans un dossier, par exemple, /data/data/com.termux/files/home/storage/shared/documents/projects/code/js/test-npm, à partir de Termux sur un Android 6 rooté exécutant npm install. L'installation démarre, mais ne réussit jamais, affichant des erreurs et des avertissements tels que npm ERR! cb() never called! et WARN tar EPERM: operation not permitted, futime.

Quelles autorisations devrais-je accorder à npm et comment ?

Mise à jour 1 : j'ai essayé d'exécuter npm install dans /storage/emulated/0/Documents/projects/code/js/test-npm, j'ai obtenu les mêmes erreurs. Termux a l'autorisation d'accès au stockage dans le gestionnaire d'applications installées sur Android.

5voto

Irfan Latif Points 16863

AVERTISSEMENT tar EPERM : opération non permise, futime indique que l'appel système futime (utilisé pour modifier les heures d'accès et de modification d'un fichier) échoue avec l'erreur : EPERM. De la page de manuel utime 1 :

EPERM ... l'UID effectif de l'appelant ne correspond pas au propriétaire du fichier ...

Cela semble être la raison de l'échec. Vous utilisez le chemin d'accès : /data/data/com.termux/files/home/storage/shared/ qui est en réalité /sdcard/ 2 (raccourci vers /storage/emulated/0/). Ce n'est pas un système de fichiers réel mais une vue émulée 3 du système de fichiers sous-jacent (ext4 ou f2fs). Il possède des autorisations fixes et ne prend pas en charge de nombreuses fonctionnalités des systèmes de fichiers Linux, y compris les liens symboliques et les ioctls comme FS_IOC_FIEMAP 4.

En raison des autorisations fixes, tous les répertoires et fichiers dans /sdcard/ sont toujours la propriété de l'utilisateur root (UID 0). Ainsi, en essayant de modifier l'horodatage d'un fichier, Opération non permise est retourné. Cependant, la commande touch utilise utimensat 5 qui a des exigences de permissions différentes.

Pour éviter ce problème, vous ne devriez pas utiliser le système de fichiers émulé. Le répertoire $HOME de Termux se trouve sur ext4 ou f2fs, donc c'est un bon endroit pour enregistrer les fichiers. Utilisez par exemple le répertoire /data/data/com.termux/files/home/npm-test.

Des commentaires :

Mais est-il possible de créer d'une manière ou d'une autre un lien à l'intérieur de $HOME vers un autre emplacement, qui accordera tous les droits que Termux a pour $HOME pour tous les sous-dossiers de cet emplacement distant ?

Non, ce n'est pas possible sur un téléphone non-rooté. Les applications ne peuvent écrire que dans leurs répertoires privés dans le stockage interne (qui est /data/data/com.termux pour Termux) et dans le stockage partagé (/sdcard/Android/data/com.termux). Les applications ayant accordé l'autorisation de Stockage peuvent lire et écrire dans tout /sdcard/. Il n'y a pas d'autre endroit sur l'appareil où les applications peuvent enregistrer des fichiers 6. Avec SELinux désactivé ou permissif, il est possible d'écrire dans un sous-répertoire créé (avec adb shell) dans /data/local/tmp, mais ce n'est pas l'utilisation prévue de ce répertoire.


LIENS :

1 Page de manuel utime
2 Comment accéder à $HOME/storage en dehors de Termux (avec un explorateur de fichiers) ?
3 Qu'est-ce que /storage/emulated/0/ ?
4 Comment puis-je créer un lien symbolique à l'intérieur de /storage/emulated/0 ?
5 Comment modifier la date de modification d'un fichier sans être root ?
6 Où les applications Android stockent-elles les données ?

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X