11 votes

Besoin d'une ligne adb shell su push & pull pour accéder à /data à partir d'un fichier batch Windows

J'ai écrit un fichier batch Windows qui remplace les publicités Amazon sur l'écran de verrouillage par des images de l'utilisateur. enraciné kindle fire hd 7", 2013 (kfsowi). Je viens d'apprendre que j'ai bâclé les commandes adb car j'exécutais "adb insecure" donc j'obtenais un accès su sans l'écrire dans les commandes adb.

Ce dont j'ai besoin : Pour l'exécuter dans un fichier batch, j'ai besoin de commandes adb shell su d'une seule ligne pour extraire de/expulser vers /data sur cet appareil. (Ou je pourrais utiliser adb -d shell su -c "mount -o remount rw, /data sur une ligne suivie de l'instruction "pull" ou "push")

J'ai corrigé une commande ls comme ceci :

  • cela a fonctionné avec adb insecure : adb ls "/data/securedStorageLocation"
  • ce dont j'avais besoin était : adb shell su -c "ls ./data/securedStorageLocation"

Maintenant, j'ai besoin de la même chose pour la traction et la poussée. Le problème :

  • Avec adb insecure, cela fonctionne bien : adb pull "/data/securedStorageLocation" "C:/destination"
  • Sans adb insecure, j'obtiens : remote object '/data/securedStorageLocation/' does not exist

Ce qui précède se produit même si je cours d'abord : adb -d shell su -c "mount -o remount rw, /data

Quelqu'un peut-il me dire comment faire le pull et le push avec adb shell et su ?

EDIT : adb root ne permet pas d'obtenir une racine sur ce dispositif

0 votes

Pour utiliser adb push o adb pull en mode racine, le démon adb sur l'appareil doit fonctionner en mode racine (ce que fait ADBInsecure).

0 votes

@Izzy Comment puis-je entrer en mode Root sans adb insecure si la commande >adb Root< ne fonctionne pas ? Je veux distribuer ceci. Il n'y a pas de problème. cualquier autre façon de pousser et de tirer le répertoire ? thx

0 votes

Je ne sais pas (j'ai toujours utilisé "ADB Insecure", car je n'arrivais pas à obtenir des informations sur la sécurité). adb root ne fonctionne pas non plus). Cela vaut peut-être la peine de poser une question distincte.

11voto

Mike N. Points 304

Eh bien, vous devez faire quelques commandes, car je ne crois pas que cela fonctionnera en une seule.

Vous devez le faire :

  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

Cela fonctionne pour moi à chaque fois.

1 votes

Qu'est-ce que shell.shell exactement ?

2 votes

@Remario linux.die.net/man/1/chown - signifie propriétaire.groupe. Lorsque vous copiez un fichier en utilisant SU, le propriétaire et le groupe seront Root.Root . La commande adb pull s'exécute en tant que shell.shell et ne pourra pas extraire le fichier de l'emplacement temporaire. Le modifier avant d'effectuer la commande pull vous permettra d'obtenir l'autorisation.

0 votes

N'oubliez pas de retirer /data/local/tmp/copyme enfin (après la traction)

4voto

jo_ Points 111
adb root; adb push /local/file /distant/root/owner/file

"adb Root" va redémarrer adbd en tant que Root et votre poussée est acceptée

2voto

Jim Klimov Points 21

Merci pour cette discussion. Cela m'a conduit à une solution qui a fonctionné assez bien pour moi pendant la sauvegarde de mon téléphone qui ne veut pas monter son ext4 interne, avant que je fasse quelque chose de drastique en essayant de le réparer (apparemment, cela nécessite des autorisations Root).

なお adb shell configure généralement un terminal texte (il peut donc convertir les caractères de fin de ligne en CRLF, et manipuler des données binaires comme des images de partition ou des archives TAR). Bien que vous puissiez contourner ce problème dans les versions Unix/Linux d'adb (par exemple, ajoutez stty raw à votre commande shelled) ou utiliser un adb plus récent avec exec-out sous Windows, il écrit toujours CRLF dans sa sortie. L'astuce consiste à faire passer les données par l'encodage et le décodage base64 (les binaires sont disponibles pour Windows en masse). Notez également que les erreurs ou les messages verbeux imprimés à stderr en coquille finissent sur stdoutadb shell dans le système hôte - vous devez donc les écarter après une inévitable expérimentation initiale.

C'est parti :

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

Windows peut facilement scripter pour couvrir toutes les partitions (vous pouvez consulter la liste en cliquant ici). ls -la /dev/block/ et/ou par cat /proc/diskstats o cat /proc/partitions ), par exemple :

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

(Note pour utiliser %%P dans les fichiers batch CMD, ou %P en shell interactif).

N'oubliez pas qu'il existe aussi mmcblk0boot[01] partitions, et que le mmcblk0 global contient toutes ces partitions dans un emballage GPT, comme tout autre disque dur ou imitation de disque dur :)

Pour estimer la taille des partitions individuelles, vous pouvez regarder la sortie de :

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

Malheureusement, je n'ai pas réussi rapidement et facilement à tar cf - mmcblkp0* et obtenir le contenu de la partition, afin que je puisse l'envoyer à par exemple 7z x -si et obtenir les données sous forme de fichiers multiples en une seule ligne portable.

A tar certains fichiers, vous pouvez le faire :

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

MISE À JOUR : J'ai trouvé d'autres astuces pour transférer des données binaires.

J'espère que cela aidera quelqu'un d'autre, Jim Klimov

0 votes

Base64 n'est pas une solution idéale. Pour les petits fichiers, elle fonctionne bien, mais pour les gros fichiers, elle augmente le temps de transfert d'un tiers !

0 votes

Bien sûr, ce n'est pas parfait pour cette raison, mais étant donné qu'à des fins de récupération, il suffit de s'accrocher à n'importe quelle paille qui peut aider... eh bien... :) Dans tous les cas, si j'envoie une partition entière à exporter comme cela, je ne me soucie pas vraiment de savoir si cela prend une heure ou une heure et demie, tant que le travail est fait de manière fiable. De plus, si, comme d'autres l'ont documenté, la variante Windows de adb.exe produit toujours du texte séparé par des CRLF, il semble que nous ne puissions pas faire grand-chose d'autre que de l'abuser avec une incapsulation adaptée à l'ASCII. Autre solution, adb exec-out pourrait être la solution - mais pour une raison ou une autre, elle n'a pas bien fonctionné pour moi.

0 votes

Mine sudo adb shell su 0 -c 'dd if=/dev/block/mmcblk0 | base64 2>/dev/null' | base64 -d >./mmcblk0.img 2>/dev/null

1voto

Evan Points 831

Il ne sera pas nécessairement d'une seule ligne, mais vous pouvez essayer de faire les actions suivantes :

  • (avec adb shell, su) Copiez les fichiers dans un emplacement temporaire accessible sur votre appareil (par exemple, /sdcard ou une carte SD externe)
  • (avec adb pull) Copiez ces fichiers de l'emplacement temporaire vers votre machine
  • Supprimer la copie temporaire

Inconvénient possible : entre la première et la dernière étape, une application malveillante, si vous l'"utilisez", peut lire et/ou modifier des fichiers dans un répertoire temporaire accessible au public. En pratique, cela est très peu probable.

1voto

Nae Points 111

J'utilise le script batch ( extract-db-from-emulator.bat ) ci-dessous pour extraire la base de données locale vers l'hôte :

@@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%

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