"Les autorisations Android sont une bête".
Dans desktop-Linux, si vous avez les permissions Root, vous êtes gâté de pouvoir tout faire (bien ou mal). J'ai découvert que dans Android, même si vous exécutez quelque chose avec les permissions Root, vous ne pouvez toujours pas faire tout ce que vous voulez sur place. Vous avez toujours besoin de quelques ajustements. Peut-être que c'est mieux ainsi ...
Ci-dessous, je vais expliquer comment j'ai réussi à monter mon partage sftp sur un point de montage en utilisant Termux, et à le rendre accessible à tous les utilisateurs/applications/explorateurs de fichiers. Crédits à MountainX. Dans son post Comment automatiser rclone-mount sans Termux ou Magisk ? il a ouvert la voie à l'utilisation de clone-mount sans Magisk/Termux, en s'affranchissant de la jungle des permissions. Cependant, je pense qu'il est possible de le faire avec Termux/Magisk également. L'avantage évident est la possibilité de créer des scripts, des cronjobs pour vérifier/restaurer régulièrement les connexions, etc.
ステップスです。
- J'ai installé openssh sous Termux, et j'ai lancé la commande
sshd
démon. Toutes les étapes suivantes ont été réalisées par connexion(s) ssh à partir de l'émulateur de terminal d'un ordinateur de bureau. Principal avantage : on peut avoir plusieurs connexions ssh, par exemple une en tant que Root-CLI, une deuxième en tant que normal-user-CLI, une troisième avec 'midnight-commander' pour vérifier les résultats du montage.
- Dans Magisk-Manager-Settings de l'appareil Android, trouvez l'option "Namespace" et choisissez "Global namespace" ou "Inherited namespace" (pour l'instant cela fonctionne avec les deux, si je trouve des problèmes à l'avenir je modifierai la réponse).
- Les exécutables rclone et fusermount DOIT être en /system/bin ET être propriétaire système:shell . PAS Racine:Racine . Il semble que lorsqu'elles sont lancées de cette manière, elles franchissent la jungle des permissions. D'autres combinaisons ne fonctionnent pas (par exemple, les propriétaires ont changé, mais le lancement se fait à partir d'un autre répertoire). Mais il n'est pas évident de les copier dans le fichier /system/bin car il est généralement monté en lecture seule. Supposons que les deux fichiers soient déjà installés dans /data/data/com.termux/files/usr/bin nous devons (a) faire /system/bin (b) les copier (c) changer les propriétaires et le mode, (d) restaurer les données. /system/bin en lecture seule.
Dans Termux :
$ su
# mount -o rw,remount /system
# cp /data/data/com.termux/files/usr/bin/rclone /system/bin/
# cp /data/data/com.termux/files/usr/bin/fusermount /system/bin/
# chown system:shell /system/bin/rclone
# chmod 775 /system/bin/rclone
# chown system:shell /system/bin/fusermount
# chmod 775 /system/bin/fusermount
# mount -o ro,remount /system
# exit
$
- Nous pouvons maintenant lancer rclone/fusermount par su -c "XXXX" à nouveau, mais cette fois-ci par le biais de la fonction /system/bin/ copies. D'ailleurs, il n'est plus nécessaire de passer la variable $PATH. Dans mes recherches, j'ai également découvert l'option su --mount-master.
su --mount-master -c "HOME=$HOME rclone -vvv mount sshfs-srv-rasp1: /storage/emulated/legacy/srv-rasp1 --allow-other"
Tant que la commande ci-dessus est en cours d'exécution, le point de montage /storage/emulated/legacy/srv-rasp1 est lié avec succès au partage sftp. L'option "--allow-other" permet aux utilisateurs autres que Root d'avoir accès. J'ai pu confirmer l'accès par une connexion ssh séparée avec 'midnight-commander'. Mais dès que la commande est interrompue avec Ctrl-c, la connexion se ferme.
- Vous pouvez ajouter l'option "--daemon" pour qu'il s'exécute en arrière-plan. Vous pouvez vérifier à tout moment que rclone est toujours en vie avec
pgrep rclone
- Afin de mettre fin à la connexion de manière élégante :
su -c "fusermount -u -z /storage/emulated/legacy/srv-rasp1"
. Notez l'option -z ("lazy") : elle force le démontage même si quelqu'un utilise le partage. Cette commande tue rclone en arrière-plan (vérifiez avec pgrep).
- Si vous vous demandez pourquoi j'utilise /storage/emulated/ héritage /XXXX comme chemin vers le point de montage, j'ai découvert que termux et su -c "XXXX" voient des choses différentes sous /storage/emulated.
Vérifier :
$ ls /storage/emulated
0 legacy
$ su -c "ls /storage/emulated"
legacy
- Il est intéressant de noter que les deux /storage/emulated/ 0 et /storage/emulated/ héritage se réfèrent à la même carte SD interne. Comme la commande rclone est exécutée par su -c "XXXX", j'ai décidé d'utiliser le dénominateur commun "legacy". Vous devez vérifier dans votre appareil le chemin exact par lequel su -c "XXXX" voit la carte SD interne.
Jusqu'à présent, notre partage sftp n'est accessible que dans termux. Les autres applications (par exemple File-Explorer) n'y ont pas accès. Ceci est lié aux droits de propriété/permission accordés au point de montage par rclone.
Vérifier pendant que rclone est en cours d'exécution :
ls -l /storage/emulated/legacy/
drwxrwx--- 2 root sdcard_r 4096 Jan 1 2014 Alarms
drwxrwx--x 5 root sdcard_r 4096 Sep 22 17:47 Android
drwxrwx--- 2 root sdcard_r 4096 Jan 1 2014 DCIM
drwxrwx--- 3 root sdcard_r 4096 Oct 6 18:14 Documents
drwxrwx--- 3 root sdcard_r 4096 Oct 8 17:28 Download
...
drwxr-xr-x 1 root root 0 Oct 9 14:38 srv-rasp1
La propriété du point de montage srv-rasp1 est Root:Root. Changer la propriété hors connexion n'a aucun effet : rclone accorde à nouveau Root:Root. Même mon ES-Explorer enraciné ne pouvait pas voir le contenu de srv-rasp1. La solution consiste à modifier les droits de propriété dans rclone : --gid 9997 --dir-perms 0771 --file-perms 0660 --umask=0
La commande jusqu'à présent :
su --mount-master -c "HOME=$HOME rclone -vvv mount sshfs-srv-rasp1: /storage/emulated/legacy/srv-rasp1 --gid 9997 --dir-perms 0771 --file-perms 0660 --umask=0 --allow-other --daemon"
Vérifier à nouveau les droits de propriété et les autorisations :
$ ls -l /storage/emulated/legacy
drwxrwx--- 2 root sdcard_r 4096 Jan 1 2014 Alarms
drwxrwx--x 5 root sdcard_r 4096 Sep 22 17:47 Android
drwxrwx--- 2 root sdcard_r 4096 Jan 1 2014 DCIM
drwxrwx--- 3 root sdcard_r 4096 Oct 6 18:14 Documents
drwxrwx--- 3 root sdcard_r 4096 Oct 8 17:28 Download
...
drwxrwx--x 1 root everybody 0 Oct 9 14:46 srv-rasp1
Voilà. Le point de montage srv-rasp1 s'est vu attribuer la propriété de groupe "everybody". ES-Explorer et toutes les autres applications peuvent maintenant accéder au contenu du point de montage srv-rasp1.
Quelques commentaires, légèrement sans rapport avec la question, mais néanmoins intéressants :
- rclone monte par défaut comme répertoire "Root" non pas le répertoire Root ("/") mais le répertoire HOME ("/home/XXXX/") de l'utilisateur qui se connecte au serveur ssh/sftp. Afin d'éviter cela, j'ai trouvé une réponse pas très claire ici : https://github.com/rclone/rclone/issues/4307 . En expérimentant, j'ai découvert que rclone accepte la syntaxe générale de la commande sshfs de Linux : server:/chemin/vers/mount/ avec la remarque qu'au lieu de "server", nous donnons le nom de la configuration. Ainsi, si je veux monter srv-rasp1/mnt/ Je dois simplement taper :
... rclone mount sshfs-srv-rasp1:/mnt /storage/emulated/legacy/srv-rasp1 ...
. Le point de montage affichera maintenant le contenu de srv-rasp1/mnt/
- Dans son billet, MountainX ajoute quelques options rclone concernant les vfs et le cache. Cela dépasse mes connaissances mais semble permettre une interaction transparente entre le périphérique <-> le serveur, l'écriture/lecture simultanée, etc. Je les ai simplement ajoutées à la ligne de commande.
Ci-dessous, mon dernier commandement :
su --mount-master -c "HOME=$HOME rclone -vvv mount sshfs-srv-rasp1:/mnt /storage/emulated/legacy/srv-rasp1 --gid 9997 --dir-perms 0771 --file-perms 0660 --umask=0 --cache-dir /storage/emulated/legacy/.cache --vfs-cache-mode full --vfs-cache-max-age 2h0m0s --vfs-cache-poll-interval 5m0s --allow-other --daemon"
Dans mon contexte, je n'en avais pas besoin :
- pour modifier quoi que ce soit concernant SELinux (voir aussi le commentaire de MountainX dans le lien mentionné ci-dessus).
- pour passer n'importe quelle variable d'environnement Termux concernant les bibliothèques (par exemple LD_LIBRARY_PATH=$LD_LIBRARY_PATH). Les exécutables rclone et fusermount sont autonomes et ne nécessitent aucune bibliothèque externe.
- pour modifier tout ce qui concerne les espaces de noms (par ex. lien de lecture ou nsenter ), comme l'a suggéré Irfan Latif (voir Comment monter rclone sur Android ? )
Cependant, je ne peux pas exclure que les ajustements mentionnés ci-dessus soient nécessaires dans d'autres contextes. C'est pourquoi je les mentionne.