11 votos

Necesito una línea adb shell su push & pull para acceder a /data desde el archivo batch de Windows

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

Lo que necesito: Para ejecutar en el archivo por lotes, necesito comandos adb shell su de una sola línea para tirar de / empujar a /data en este dispositivo. (O podría utilizar adb -d shell su -c "mount -o remount rw, /data en una línea seguida por el tirón o el empuje)

He arreglado un comando ls así:

  • esto funcionó con adb insecure: 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 insecure, esto funciona bien: adb pull "/data/securedStorageLocation" "C:/destination"
  • Sin adb insecure me sale: remote object '/data/securedStorageLocation/' does not exist

Lo anterior ocurre aunque primero corra: adb -d shell su -c "mount -o remount rw, /data

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

EDITAR: adb root el comando no obtiene el Root en este dispositivo

0 votos

Para utilizar adb push o adb pull en modo Root, el demonio adb en el dispositivo debe ejecutarse en modo Root (que es lo que hace ADBInsecure).

0 votos

@Izzy ¿Cómo puedo entrar en modo Root sin adb insecure si el comando >adb Root< no funciona? Quiero distribuir esto. ¿Existe cualquier ¿otra forma de empujar y tirar del directorio? thx

0 votos

No sé (siempre he utilizado "ADB Insecure", ya que no he podido conseguir adb root para trabajar tampoco). ¿Merece la pena hacer una pregunta aparte, tal vez?

12voto

Brandon Wilson Puntos 183

Pues tienes que hacer varios comandos, ya que no creo que funcione en uno solo.

Tienes que hacerlo:

  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 me funciona siempre.

1 votos

Qué es exactamente shell.shell

2 votos

@Remario linux.die.net/man/1/chown - significa propietario.grupo. Cuando se copia 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. Si lo cambias antes de hacer el pull te dará permiso.

2voto

undefine Puntos 253

Gracias por esta discusión. Me llevó a una solución que funcionó bastante bien para mí, mientras que la copia de seguridad de mi teléfono que no se monta su ext4 interna, antes de hacer algo drástico al tratar de arreglarlo (al parecer, esto necesita permisos Root).

Tenga en cuenta que adb shell generalmente configura un terminal de texto (por lo que puede convertir los caracteres de fin de línea en CRLF, manipulando datos binarios como imágenes de partición o archivos TAR). Aunque se puede evitar esto en las versiones de Unix/Linux de adb (por ejemplo, añadiendo stty raw a su comando shelled) o utilizar algún adb más reciente con exec-out en Windows sigue escribiendo CRLF en su salida. El truco más ingenioso es pasar los datos a través de la codificación y decodificación de base64 (los binarios están disponibles para Windows en masa). También hay que tener en cuenta que los errores o mensajes verbose impresos en stderr en cáscara terminan en stdout de adb shell en el sistema anfitrión, por lo que conviene descartarlas tras la inevitable experimentación inicial.

Aquí va:

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

Puede ser fácilmente programado por Windows para cubrir todas las particiones (puede buscar la lista por ls -la /dev/block/ y/o por cat /proc/diskstats o 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 de uso %%P en los archivos por lotes CMD, o %P en el shell interactivo).

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

Para estimar los tamaños de las particiones individuales, puede mirar la salida de:

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

Desgraciadamente, no conseguí de forma rápida y sencilla tar cf - mmcblkp0* y obtener el contenido de la partición, para poder canalizarlo, por ejemplo, a 7z x -si y sacar los datos en forma de múltiples archivos en una sola línea portátil también.

A tar algunos archivos se 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

1voto

Sarge Borsch Puntos 123

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

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

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

1voto

Nae Puntos 101

Utilizo el lote script ( extract-db-from-emulator.bat ) a continuación para sacar 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%

1voto

hannes ach Puntos 101

Veo un error con

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

su: uid/gid inválido '-c'

El solución está en Linux

adb shell su 0 '<your command>'

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X