Necesita adb shell su push & pull de una línea para acceder a/datos del archivo por lotes de Windows

Escribí un archivo por lotes de Windows que reemplaza los anuncios de la pantalla de bloqueo de Amazon con imágenes de usuario en kindle fire hd 7 " rooteado ", 2013 (kfsowi). Acabo de enterarme de que cometí un error con los comandos adb porque estaba ejecutando "adb insecure", por lo que estaba obteniendo su acceso sin escribirlo. en los comandos adb.

Lo que necesito: para ejecutar un archivo por lotes, necesito comandos adb shell su de una línea para extraer/empujar /dataen este dispositivo. (O podría usar adb -d shell su -c "mount -o remount rw, /dataen una línea seguida de tirar o empujar)

He arreglado un comando ls como este:

  • esto funcionó con adb inseguro:adb ls "/data/securedStorageLocation"
  • lo que necesitaba era:adb shell su -c "ls ./data/securedStorageLocation"

Ahora necesito lo mismo para tirar y empujar. El problema:

  • Con adb inseguro, esto funciona bien:adb pull "/data/securedStorageLocation" "C:/destination"
  • Sin adb inseguro obtengo:remote object '/data/securedStorageLocation/' does not exist

Lo anterior sucede incluso si ejecuto por primera vez:adb -d shell su -c "mount -o remount rw, /data

¿Alguien puede decirme cómo hacer pull and push con adb shell y su?

EDITAR: adb rootel comando no gana root en este dispositivo

Para usar adb pusho adb pullen modo raíz, el demonio adb en el dispositivo debe estar ejecutándose en modo raíz (que es lo que hace ADBInsecure).
@Izzy ¿Cómo puedo acceder al modo root sin adb insecure si el comando >adb root< no funciona? Quiero distribuir esto. ¿Hay alguna otra forma de empujar y extraer el directorio? gracias
No lo sé (siempre usaba "ADB Insecure", ya que tampoco podía ir adb roota trabajar). ¿Vale la pena una pregunta aparte, tal vez?

Respuestas (6)

Bueno, tienes que hacer algunos comandos, ya que no creo que funcione en uno.

Necesitas hacer:

  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

Esto funciona para mí cada vez.

qué es exactamente shell.shell
@Remario linux.die.net/man/1/chown - significa propietario.grupo. Cuando copie un archivo usando SU, el propietario y el grupo serán root.root. El comando adb pull se ejecuta como shell.shell y no podrá extraer el archivo de la ubicación temporal. Cambiarlo antes de hacer pull le dará permiso.
no te olvides de quitar /data/local/tmp/copymefinalmente (después de tirar)

Gracias por esta discusión. Me llevó a una solución que funcionó lo suficientemente bien para mí mientras hacía una copia de seguridad de mi teléfono que no montará su ext4 interno, antes de hacer algo drástico al tratar de arreglarlo (aparentemente, esto necesita permisos de root).

Tenga en cuenta que adb shellgeneralmente configura una terminal de texto (por lo que puede convertir caracteres de final de línea individuales a CRLF, manipulando datos binarios como imágenes de partición o archivos TAR). Si bien puede solucionar esto en las versiones Unix/Linux de adb (por ejemplo, agregar stty rawa su comando shell) o usar algún adb más nuevo con exec-outopción, en Windows todavía escribe CRLF en su salida. El buen truco es pasar datos a través de la codificación y decodificación base64 (los binarios están disponibles para Windows en masa). También tenga en cuenta que los errores o los mensajes detallados impresos stderren el shell terminan en el stdoutprograma adb shellen el sistema host, por lo que desea descartarlos después de la inevitable experimentación inicial.

Aquí va:

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

Windows puede programar fácilmente para cubrir todas las particiones (puede buscar la lista por ls -la /dev/block/y/o por cat /proc/diskstatso cat /proc/partitions), por ejemplo:

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

(Nota para usar %%Pen archivos por lotes CMD o %Pen shell interactivo).

No olvide que también hay mmcblk0boot[01]particiones, y que el mmcblk0conjunto contiene todas esas particiones en un envoltorio GPT, como cualquier otro disco duro o imitador de uno :)

Para estimar los tamaños de partición individuales, puede mirar el resultado de:

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

Desafortunadamente, no logré tar cf - mmcblkp0*obtener el contenido de la partición de manera rápida y fácil, por lo que también pude canalizarlo, por ejemplo 7z x -si, y obtener los datos como múltiples archivos en una sola línea portátil.

Para taralgunos archivos puede:

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

ACTUALIZADO: Encontré algunos trucos más para transferir datos binarios.

Espero que esto ayude a alguien más, Jim Klimov

base64 no es una solución ideal. Para archivos pequeños funciona bien, pero para archivos grandes, ¡aumenta el tiempo de transferencia en un tercio!
Por supuesto, no es perfecto debido a eso, pero dado que para fines de recuperación, agarrar cualquier pajita que pueda ayudar es lo suficientemente bueno... bueno... :) En cualquier caso, si envío una partición completa para exportar de esta manera, Realmente no me importa si toma una hora u hora y media, siempre y cuando haga el trabajo de manera confiable. Además, si, como algunos otros han documentado, la variante de Windows de adb.exe efectivamente siempre genera texto separado por CRLF, parece que no podemos hacer más que abusar de él con la encapsulación compatible con ASCII. Alternativamente, adb exec-outpodría ser la solución, pero por alguna razón no funcionó bien para mí.
míasudo adb shell su 0 -c 'dd if=/dev/block/mmcblk0 | base64 2>/dev/null' | base64 -d >./mmcblk0.img 2>/dev/null
Pero, ¿qué pasa si no usamos base64?!
Como se comentó anteriormente, puede haber problemas al enviar archivos binarios como texto sin formato entre Linux (Android) y Windows (adb). Es posible que no necesite la encapsulación si ambas partes están de acuerdo con los finales de línea.
adb root; adb push /local/file /distant/root/owner/file

"adb root" reiniciará adbd como root y luego se aceptará su inserción

No necesariamente será de una sola línea, pero puede intentar realizar las siguientes acciones:

  • (con adb shell, su) Copie los archivos a una ubicación accesible temporal en su dispositivo (por ejemplo /sdcard, o una tarjeta SD externa)
  • (con adb pull) Copie estos archivos desde la ubicación temporal a su máquina
  • Eliminar copia temporal

Posible inconveniente: entre el primer y el último paso, una aplicación maliciosa, si la está "usando", puede leer y/o modificar sus archivos en un directorio temporal de acceso público. En la práctica, esto es muy poco probable.

Utilizo el script por lotes ( extract-db-from-emulator.bat) a continuación para extraer la base de datos local al host:

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

Veo un error con

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

su: uid/gid no válido '-c'

La solución está en Linux .

adb shell su 0 '<your command>'
agregar -cantes del comando, como:sudo adb shell su 0 -c 'whoami'