Root-Befehle im Terminal-Emulator funktionieren nicht systemweit

Ich möchte den folgenden Befehl als root im Android Terminal Emulator ausführen .

mount -o bind /storage/extSdCard /data/media

Ich habe dies auf einem Samsung Galaxy S3 mit CyanogenMod 11 getestet und es funktioniert wie erwartet. Wenn ich /data/mediamit einer anderen App wie dem Dateimanager ES File Explorer einsteige, erhalte ich den Inhalt der externen SD-Karte anstelle des internen Speichers.

Das Problem ist, dass dies auf einem anderen S3, den ich habe, nicht funktioniert, auf diesem läuft Stock TouchWiz ROM Version 4.3 und ist mit CF-Auto-Root gerootet . Ich habe auch versucht, Adams benutzerdefinierten Kernel zu verwenden, und es funktioniert auch nicht.

ls /data/mediaWenn ich den Befehl auf dem Terminal ausführe und dann als root eintippe, wird der Inhalt der externen SD-Karte angezeigt, aber wenn ich ein anderes Terminal als normaler Benutzer (nicht root) starte und denselben Befehl eingebe, erhalte ich den Inhalt des internen Speicher. Dasselbe passiert, wenn ich versuche, /data/mediamit dem Dateimanager ES File Explorer darauf zuzugreifen

Es scheint also, dass Root-Befehle nur für den Root-Benutzer wirksam sind, nicht für andere systemweite Benutzer. Was könnte die Ursache für dieses Verhalten sein?

UPDATE: OK, mein Fehler, ich habe mich nicht richtig ausgedrückt. Es stimmt, dass ein normaler Benutzer nicht darauf zugreifen kann /data/media. Aber /data/mediader wahre Ort der Dateien ist der interne Speicher. Es gibt viele Pfade, auf denen Android diesen Speicher für normale Benutzer verfügbar macht, wie /sdcardoder /storage/sdcard0, die beide /data/media/0über ein FUSE-Dateisystem verweisen.

Mein Gedanke hier ist, dass, wenn ich einen Ordner mit dem Namen 0auf der externen SD erstelle und dann /storage/extSdCardan binde /data/media, wenn das System versucht, darauf zuzugreifen, /sdcardoder der Inhalt von as nicht mehr auf den internen Speicher, sondern stattdessen auf die externe SD /storage/sdcard0verweist ./storage/extSdCard/0/data/media

Dies funktioniert wie erwartet auf CM11, wenn ich es als Root ausführe

mount -o bind /storage/extSdCard /data/media

Wenn ich dann auf das Terminal zugreife /sdcard, entweder als root oder als normaler Benutzer, erhalte ich den Inhalt von /storage/extSdCard/0. Dasselbe passiert, wenn ich ES File Explorer im normalen oder Root-Modus verwende

Aber wenn ich dasselbe mit der gerooteten Stock 4.3-Firmware mache, funktioniert es nicht. Nur root auf dem Terminal kann die Änderungen sehen, normale Benutzer auf dem Terminal und normale und root-Benutzer auf ES File Explorer sehen keine Änderung

I get the contents of the internal memory.)-- Ich verstehe nicht, wie ein normaler Benutzer /data/mediaohne erhöhte Rechte überhaupt Inhalte sehen kann. Sie sollten eine Fehlermeldung im Terminal erhalten, etwa "Operation nicht zulässig". In Bezug auf Ihren zweiten Fall mit ES sollte ES als normaler Benutzer nichts im /dataVerzeichnis anzeigen, und ich weiß nicht, wie ich mit ES direkt zu einem bestimmten Ort wechseln kann (es scheint keine Standortleiste zu haben). Trotzdem /data/mediakann ein normaler Benutzer mit Terminal immer noch darauf zugreifen. Ich habe es überprüft, funktioniert gut.
Ja, du hast Recht, ich habe mich nicht gut ausgedrückt. Ich habe die Frage mit zusätzlichen Informationen bearbeitet

Antworten (2)

Mein Fall, ich nehme an, es ist der gleiche Grund für Sie.

Gehen Sie zu Ihrer Superuser-Manager-App, ich nehme an, es ist SuperSU.

Gehen Sie zu den Einstellungen und suchen Sie nach „Mount Namespace Separation“ und prüfen Sie, ob es aktiviert ist. Deaktivieren Sie die Option und starten Sie neu.

SuperSU hat diese Option bereitgestellt, um Ihr System sicherer zu machen, indem der Mount-Namespace einer App vor dem anderer versteckt wird. Wenn Sie also etwas mounten oder unmounten, ist es nur für die App (UID) sichtbar, die Sie verwenden, und sonst nichts.

Alternativ sukönnen Sie beim Ausführen von eine Option hinzufügen, -mdamit Ihre Shell die Kontrolle über den Master-Mount-Namespace hat. Dann funktionieren deine Reittiere global.

Anscheinend ist dies jetzt eine Sicherheitsfunktion von Android SELinux – Mounts, die von den meisten Prozessen initiiert werden, sind für andere Prozesse nicht sichtbar. Siehe diese Antwort .

Ein verwandter Android-Kernel-Entwicklungsthread schlägt vor, einen nicht benötigten Systemdienst (z. B. /system/bin/debuggerd) durch ein Shell-Skript zu ersetzen, das den gewünschten Mount-Befehl ausführt. Dies würden Sie mit starten start debuggerd.

Update: Dies hat bei mir nach einem Neustart funktioniert.