Benötigen Sie eine einzeilige ADB-Shell für Push & Pull, um auf / Daten aus der Windows-Batchdatei zuzugreifen


8

Ich habe zwei Tage lang gekämpft. Hoffe hier auf Hilfe.

Ich habe eine Windows-Batchdatei geschrieben, die Amazon-Sperrbildschirmanzeigen durch Benutzerbilder auf verwurzeltem Kindle Fire HD 7 ", 2013 (kfsowi) ersetzt. Ich habe gerade erfahren, dass ich die adb-Befehle verpfuscht habe, weil ich" adb unsicher "ausgeführt habe und daher su-Zugriff erhalten habe, ohne sie zu schreiben in die adb Befehle.

Was ich brauche: Um in einer Batch-Datei ausgeführt zu werden, benötige ich einzeilige adb shell su-Befehle, um von / push to / data auf diesem Gerät zu ziehen. (Oder ich könnte -> adb -d shell su -c "mount -o remount rw, / data <- in einer Zeile gefolgt von Pull oder Push verwenden)

Ich habe einen ls-Befehl wie folgt behoben:

  • Dies funktionierte mit ADB unsicher: ADB ls "/ data / SecureStorageLocation"
  • Was ich brauchte war: adb shell su -c "ls ./data/securedStorageLocation"

Jetzt brauche ich das gleiche zum Ziehen und Schieben. Das Problem:
- Bei unsicherem ADB funktioniert dies einwandfrei : ADB Pull "/ data / SecuredStorageLocation" "C: / Ziel"
- Ohne unsicheres ADB wird Folgendes angezeigt : Remote-Objekt '/ data / SecuredStorageLocation /' existiert nicht

Oben passiert auch, wenn ich zum ersten Mal Folgendes ausführe: adb -d shell su -c "mount -o remount rw, / data

Kann mir jemand sagen, wie man mit adb shell und su zieht und drückt. Ich habe viele Permutationen ausprobiert und kann das nicht herausfinden. Vielen Dank für Ihre Zeit.

BEARBEITEN: Der Befehl adb root erhält auf diesem Gerät kein Root


Zur Verwendung adb pushoder adb pullim Root-Modus muss der ADB-Daemon auf dem Gerät im Root-Modus ausgeführt werden (was ADBInsecure tut).
Izzy

@Izzy Wie kann ich in den Root-Modus gelangen, ohne dass adb unsicher ist, wenn der Befehl> adb root <nicht funktioniert? Ich möchte das verteilen. Gibt es eine andere Möglichkeit, das Verzeichnis zu verschieben und abzurufen? thx
sjoy

Ich weiß es nicht (habe immer "ADB Insecure" verwendet, da ich auch nicht adb rootzur Arbeit kommen konnte). Vielleicht eine andere Frage wert?
Izzy

Antworten:


9

Nun, Sie müssen ein paar Befehle ausführen, da ich nicht glaube, dass es in einem funktionieren wird.

Sie müssen tun:

  1. adb shell
  2. su
  3. cd /data/path/of/file
  4. cp /data/path/of/file/copyme /data/local/tmp
  5. chown shell.shell /data/local/tmp/copyme
  6. exit
  7. exit
  8. adb pull /data/local/tmp/copyme /destination/copyme

Das funktioniert bei mir jedes Mal.


1
Was genau ist shell.shell
Remario

1
@Remario linux.die.net/man/1/chown - das bedeutet owner.group. Wenn Sie eine Datei mit SU kopieren, sind Eigentümer und Gruppe root.root. Der Befehl adb pull wird als shell.shell ausgeführt und kann die Datei nicht vom temporären Speicherort abrufen. Wenn Sie es vor dem Ziehen ändern, erhalten Sie die Erlaubnis.
Mike N.

2

Danke für diese Diskussion. Es führte mich zu einer Lösung, die beim Sichern meines Telefons gut genug funktionierte und die interne ext4 nicht bereitstellte, bevor ich beim Versuch, das Problem zu beheben, etwas drastisches unternahm (anscheinend sind Root-Berechtigungen erforderlich).

Beachten Sie, dass im adb shellAllgemeinen ein Textterminal eingerichtet wird (so dass einzelne Zeilenendezeichen in CRLF konvertiert werden können, wodurch Binärdaten wie Partitionsbilder oder TAR-Archive entstellt werden). Während Sie dies in Unix / Linux-Versionen von adb umgehen können (z. B. stty rawzu Ihrem geschälten Befehl hinzufügen ) oder ein neueres adb mit exec-outOption verwenden können, schreibt es unter Windows immer noch CRLF in seine Ausgabe. Der nette Trick besteht darin, Daten durch Base64-Codierung und -Decodierung zu übertragen (Binärdateien sind für Windows en masse verfügbar). Beachten Sie auch , dass Fehler oder ausführliche Meldungen zu bedruckenden stderrin Shell Ende auf bis stdoutvon adb shellProgramm im Host - System - so dass Sie diese nach unvermeidlichen anfänglichen Experimentieren verwerfen wollen.

Hier geht:

adb shell "su -c 'cat /dev/block/mmcblk0p25 | base64' 2>/dev/null" | base64 -d > p25

Kann von Windows einfach per Skript erstellt werden, um alle Partitionen abzudecken (kann die Liste nach ls -la /dev/block/und / oder nach cat /proc/diskstatsoder nachschlagen cat /proc/partitions), z.

for /L %P in (1,1,25) do ..\platform-tools\adb shell "su -c 'cat /dev/block/mmcblk0p%P | base64' 2>/dev/null" | base64 -d > s3-mmcblk0p%P.img

(Hinweis zur Verwendung %%Pin CMD-Batchdateien oder %Pin einer interaktiven Shell).

Vergessen Sie nicht, dass es auch mmcblk0boot[01]Partitionen gibt und dass die mmcblk0Gesamtheit all diese Partitionen in einem GPT-Wrapping enthält, genau wie jede andere Festplatte oder jeder Imitator einer :)

Um die einzelnen Partitionsgrößen abzuschätzen, können Sie die Ausgabe von:

fdisk -u -l /dev/block/mmcblk0*

Leider habe ich es nicht schnell und einfach geschafft tar cf - mmcblkp0*, den Partitionsinhalt zu erhalten, so dass ich ihn an z. B. 7z x -siweiterleiten und die Daten auch als mehrere Dateien in einem tragbaren Einzeiler ausgeben konnte.

Zu tareinigen Dateien können Sie:

adb shell "su -c 'cd /mnt/data && tar czf - ./ | base64' 2>/dev/null" | base64 -d > s3-mmcblk0p25-userdata.tar.gz

AKTUALISIERT: Es wurden weitere Tricks zum Übertragen von Binärdaten gefunden.

Ich hoffe, das hilft jemand anderem, Jim Klimov


base64 ist keine ideale Lösung. Bei kleinen Dateien funktioniert es einwandfrei, bei großen Dateien erhöht sich die Übertragungszeit um ein Drittel!
iBug

Natürlich ist es aus diesem Grund nicht perfekt, aber angesichts der Tatsache, dass es für Wiederherstellungszwecke gut genug ist, nach Strohhalmen zu suchen, die helfen können ... na ja ... :) Auf jeden Fall, wenn ich eine ganze Partition für den Export wie diese sende, Es ist mir eigentlich egal, ob es eine Stunde gegen anderthalb Stunden dauert, solange es die Arbeit zuverlässig erledigt. Auch wenn, wie einige andere dokumentiert haben, die Windows-Variante von adb.exe effektiv immer CRLF-getrennten Text ausgibt, können wir nur wenig tun, als ihn mit ASCII-freundlicher Kapselung zu missbrauchen. Alternativ adb exec-outkönnte die Lösung sein - aber aus irgendeinem Grund hat es für mich nicht gut funktioniert.
Jim Klimov

1

Ich verwende das Batch-Skript ( extract-db-from-emulator.bat) unten, um die lokale Datenbank auf den Host zu ziehen:

@@echo off
SET adb_path="%USERPROFILE%\AppData\Local\Android\sdk\platform-tools\"
SET application_id="com.example.myapp"
SET root_access_filepath="/data/user/0/%application_id%/databases/local.db"
SET pullable_filepath="/mnt/sdcard/DCIM/local.db"
SET host_directory="%USERPROFILE%\Desktop"
SET root_command="su 0 cp"
%adb_path%adb.exe shell "%root_command% %root_access_filepath% %pullable_filepath%"
%adb_path%adb.exe pull %pullable_filepath% %host_directory%

0

Es muss nicht unbedingt einzeilig sein, aber Sie können versuchen, die folgenden Aktionen auszuführen:

  • (mit adb shell, su) Kopieren Sie die Dateien an einen vorübergehend zugänglichen Speicherort auf Ihrem Gerät (z. B. /sdcardoder auf einer externen SD-Karte).
  • (mit adb pull) Kopieren Sie diese Dateien vom temporären Speicherort auf Ihren Computer
  • Temporäre Kopie löschen

Möglicher Nachteil: Zwischen dem ersten und letzten Schritt kann eine böswillige App, wenn Sie sie "verwenden", ihre Dateien in einem temporären öffentlich zugänglichen Verzeichnis lesen und / oder ändern. In der Praxis ist dies sehr unwahrscheinlich.


0

Ich sehe einen Fehler mit

adb shell "su -c '<your command>'"

su: ungültige uid / gid '-c'

Die Lösung ist unter Linux

adb shell su 0 '<your command>'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.