1 votes

Rendre le partage cifs/smb monté visible pour un utilisateur normal sous Android-x86

Comme on ne peut plus faire confiance à ES Explorer, il me fallait une autre solution pour accéder facilement à mes partages réseau SMB/CIFS. Le montage d'un partage réseau SMB/CIFS dans Android-x86 (version 9 R2) s'est avéré beaucoup plus facile que toutes les solutions que j'ai trouvées sur StackExchange. Je n'ai pas eu besoin d'installer de logiciel ou d'application, mount -t cifs fonctionne dès sa sortie de la boîte.

Le problème est que je ne peux pas rendre ce montage visible pour un utilisateur normal. Seul Root ou superuser, quel que soit son nom dans Android, voit et peut utiliser le système de fichiers monté, alors que l'utilisateur normal continue à voir le point de montage comme un répertoire du propre système de fichiers d'Android.

Pour clarifier, jetez un coup d'œil à cette session de terminal. Dans cet exemple, Android est exécuté dans une VM Virtual Box, l'adresse IP est celle de l'hôte lui-même. Je crée un sous-répertoire dans /sdcard/Download/ pour le monter, avec l'intention de déplacer facilement les fichiers de Download vers le partage monté sur ce sous-répertoire. Je monte le partage en tant que super-utilisateur, avec les options appropriées, puis, à la fois en tant qu'utilisateur normal et en tant que super-utilisateur, je liste le contenu du sous-répertoire et j'affiche le sous-répertoire :

$ cd "/$EXTERNAL_STORAGE"/Download/ # i.e. /sdcard/Download/
$ mkdir SERVER_SHARE
$ touch SERVER_SHARE/"NOT THE MOUNTED SHARE" # a marker for the base directory
$ su -c "mount -v -o username=guest,rw,noperm,iocharset=utf8 -t cifs //192.168.1.10/SHARE $PWD/SERVER_SHARE"
$ ls SERVER_SHARE/
'NOT THE MOUNTED SHARE'
$ su -c "ls SERVER_SHARE"
... lists all the files on the share ...
$ stat SERVER_SHARE
  Size: 4096        Blocks: 0          IO Block: 512   directory
Device: 1dh/29d Inode: 409629          Links: 2
Access: (0770/drwxrwx---)  Uid: ( 0/    root)   Gid: ( 9997/everybody)
...
$ su -c "stat SERVER_SHARE"
  Size: 0           Blocks: 0          IO Block: 512   directory
Device: 1eh/30d Inode: 217          Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 0/    root)   Gid: ( 0/    root)
...

Vous voyez la différence entre un utilisateur normal et un super utilisateur : ls montre des contenus de répertoire différents parce que stat dit qu'ils voient le sous-répertoire sur un autre appareil. Une explication possible pourrait être que l'utilisateur normal a le descripteur de fichier pour le répertoire ouvert, et continue à utiliser ce descripteur de fichier et le contenu vers lequel il pointe, même après qu'un autre système de fichiers soit monté dessus. Mais cela n'expliquerait probablement pas pourquoi exactement la même chose se produit si je mets la balise mkdir dans la commande su pour le mount .

Pour l'instant, je ne peux accéder au partage samba monté de l'hôte VM qu'à partir du terminal, en tant que super utilisateur, pour copier des fichiers entre le partage et le dossier de téléchargement. J'ai mis le mkdir y mount dans un script, et a ajouté les commandes touch pour monter le répertoire sous le point de montage comme "pas le partage réseau".

Ma question est la suivante Comment rendre le partage monté visible pour l'utilisateur normal, de sorte que je puisse utiliser les applications Android comme "Files" et d'autres gestionnaires de fichiers pour y accéder dans une interface graphique.

0 votes

0 votes

Merci pour le lien. Je dois faire quelques études pour le comprendre, mais c'est pour cela que nous sommes ici.

0 votes

En ce qui concerne le montage invisible, je suppose qu'il est causé par les espaces de noms de montage isolés (qui peuvent être désactivés en fonction de la solution Root).

2voto

db-inf Points 131

Résumé de la gestion

  • Vous n'en avez probablement pas besoin.
  • Il existe des applications gratuites (oui, gratuites) pour accéder aux partages réseau.
  • Le montage des partages réseau ne nécessite même pas ces applications ; tout ce dont vous avez besoin est inclus dans Android-x86.

Comment accéder à vos partages réseau en tant qu'utilisateur d'Android-x86

  • Il existe de nombreuses applications de gestion de fichiers qui vous permettent de copier des fichiers entre vos répertoires Android et vos partages réseau. L'une d'entre elles, que je trouve particulièrement adaptée, est une application gratuite appelée X-Plore File Manager, car elle vous permet de configurer des raccourcis vers vos partages réseau et offre une vue à double volet, de sorte que vous pouvez ouvrir les répertoires source et de destination dans leur propre volet.

  • Toutefois, pour accéder directement aux partages réseau à partir des applications, sans l'intermédiaire d'un gestionnaire de fichiers, il est utile de monter ces partages réseau dans les dossiers visibles par l'utilisateur d'Android, comme Téléchargements, Films, Musique ou Images.

  • Bien qu'il ne s'agisse pas vraiment de linux, l'une des choses linuxiennes qu'Android-x86 utilise pour compliquer la vie de l'utilisateur sans méfiance, pour son propre bien, est la suivante Sécurité renforcée de Linux ou SELinux. Il est très simple de monter un partage réseau, il n'y a rien à installer. Mais vous avez besoin du contexte de sécurité approprié pour monter un partage réseau afin qu'il soit visible pour vous en tant qu'utilisateur.

  • Pour rendre les choses reproductibles, vous pouvez écrire un script pour la procédure de montage. Android-x86 est livré avec un shell Korn MirBSD dépouillé. Vous pouvez lire son page de manuel en ligne.

  • Vous pouvez utiliser mon script comme exemple ; je l'ai clarifié avec des commentaires. Dans ce script, remplissez votre propre nom de serveur et l'adresse IP du serveur, et peut-être le nom du partage que vous utilisez le plus ; le mien est nommé RAMDISK, qui est ... un ramdisk.

  • Comme mon appareil Androix-x86 n'est pas accessible aux autres, j'ai codé en dur mon nom d'utilisateur et mon mot de passe. J'espère que vous ne pourrez pas retrouver ma réponse originale après que je l'ai modifiée pour cacher mon nom d'utilisateur et mon mot de passe. Vous préférez probablement ne pas coder vos informations d'identification dans un script ; vous pouvez utiliser la commande de lecture intégrée au shell pour les saisir à l'invite de commande.

    !/bin/sh

    main() {

    default to my preferred share

    typeset share="${1:-RAMDISK}"

    MY SERVER

    typeset servername=MYSRV typeset serverip=192.168.1.10

    SELinux context for the virtual filesystem sdcardfs:

    typeset context="context=u:object_r:sdcardfs:s0,iocharset=utf8"

    mount (from root mount namespace) to /mnt/runtime/write/emulated which is

    # propagated to all apps' mount namespaces.

    typeset mntpt=/mnt/runtime/write/emulated/0/Download/"$servername"_"$share"

    make mountpoint and add file as warning: if you see that file,

    # you do not see the network share

    [ -d "$mntpt" ] || su -c "mkdir -p \"$mntpt\" ; \ touch \"$mntpt\"/\" @=# NOT A MOUNTED NETWORK SHARE #=@. \""

    first try to mount with my credentials, used as file ownership on server, else as guest

    # su not needed when already running as su, but does no harm either

    su -c "mount -v -o username=myuser,password=mypassword,rw,noperm,$context \ -t cifs //$serverip/\"$share\" \"$mntpt\" || \ mount -v -o username=guest,ro,noperm,$context \ -t cifs //$serverip/\"$share\" \"$mntpt\" || \ echo mount of \"<$share>\" failed" unset -f main } main "$@"

  • J'ai enregistré ce script sur mon appareil Android-x86 en tant que /sdcard/mounty . SELinux rend délicat de le rendre exécutable, mais ce n'est pas nécessaire : vous pouvez laisser les commandes intégrées du shell source o . l'exécuter. À partir d'une application terminale, ou après avoir appuyé sur Alt-F1 pour accéder à l'écran d'accueil de l'application. tty1 (Alt-F7 vous ramène à l'interface graphique), entrez simplement

    . /sdcard/mounty MYSHARENAME

  • Au lieu d'un point de montage dans .../Download/ vous pouvez monter vos films partagés sous /mnt/runtime/write/emulated/0/Movies/ et le partage en réseau avec votre album de famille sous /mnt/runtime/write/emulated/0/Pictures/ bien sûr.

Détails techniques

  • Vous pouvez lire la raison pour laquelle vous avez besoin d'un contexte SELinux dans cette réponse a "Comment lier le montage d'un dossier dans /sdcard avec les permissions correctes ?" . Je n'en comprends que la moitié, mais l'essentiel est que sous Android, non seulement les utilisateurs, mais aussi les applications ont besoin de droits d'accès.

  • Pour cela, un système de fichiers spécial appelé sdcardfs est utilisé. Il expose les dossiers qu'un utilisateur voit sous le nom de /sdcard Les applications sont placées sur trois points de montage différents, en fonction des droits d'accès de l'application, et sur un point de montage supplémentaire pour l'accès de l'utilisateur. Ceci est un extrait de ce que le mount rapports de commandement :

    /data/media on /mnt/runtime/default/emulated type sdcardfs (rw,...,gid=1015,multiuser,mask=6) /data/media on /mnt/runtime/read/emulated type sdcardfs (rw,...,gid=9997,multiuser,mask=23) /data/media on /mnt/runtime/write/emulated type sdcardfs (rw,...,gid=9997,multiuser,mask=7) /data/media on /storage/emulated type sdcardfs (rw,...,gid=1015,multiuser,mask=6)

  • El /read/ y /write/ Les points de montage parlent d'eux-mêmes.

  • Je suppose que le /default/ mountpoint sert à naviguer dans les répertoires uniquement, pour les applications n'ayant aucun accès en lecture ou en écriture.

  • Exploration de l'arborescence des répertoires avec la commande ls -l vous trouvez le répertoire /storage/emulated/ tenant un sous-répertoire pour chaque utilisateur. Dans les installations à utilisateur unique, ce sera l'utilisateur 0 dans lequel vous trouverez les répertoires des utilisateurs Download , Movies etc. Lorsque l'utilisateur 0 se connecte, son /storage/emulated/0/ est reflétée sur /storage/self/primary/ .

  • Annuaire /sdcard/ est, en fait, un lien symbolique vers ce site. /storage/self/primary/ et voilà, c'est pourquoi l'utilisateur voit ses répertoires utilisateurs sous /sdcard/ qui est tout ce qu'un utilisateur non-Root peut voir de son système de fichiers.

  • Montage du partage réseau, avec le bon contexte SELinux, sur un répertoire sous /mnt/runtime/write/emulated/0/ (notez le write ), comme dans mon script, rend le partage visible quelque part sous les mêmes 4 répertoires :

    //192.168.1.10/RAMDISK on /mnt/runtime/default/emulated/0/Download/FRT_RAMDISK type cifs (rw,... //192.168.1.10/RAMDISK on /mnt/runtime/read/emulated/0/Download/FRT_RAMDISK type cifs (rw,... //192.168.1.10/RAMDISK on /mnt/runtime/write/emulated/0/Download/FRT_RAMDISK type cifs (rw,... //192.168.1.10/RAMDISK on /storage/emulated/0/Download/FRT_RAMDISK type cifs (rw,...

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