Copiar archivos en el shell de ADB con run-as

¿Hay alguna manera de escribir un script que copie archivos desde un shell ADB usando run-as?

La única manera que conozco de copiar en el shell de adb es usar cat source > dest (editar: las versiones android modernas tienen el comando cp , lo que hace innecesaria esta pregunta), pero sólo puedo citar el signo más grande que un nivel Profundo – por lo que mi secuencia de comandos puede pasar a adb shell, pero no a shell de adb run-as.

Por ejemplo, esto funciona:

adb shell "cat source > dest"

Pero esto no:

adb shell run-as "cat source > dest"

Ni esto:

adb shell "run-as cat source \> dest"

Incluso he intentado crear un pequeño script y subirlo al dispositivo, pero no puedo ejecutar el script desde el shell de adb – me dice "permission denied". Yo tampoco puedo escribir el guión.

La razón por la que quiero hacer esto es copiar un archivo en el área de almacenamiento privado de una aplicación, específicamente, estoy usando un script para modificar las preferencias compartidas y volver a colocar las preferencias modificadas. Sólo la aplicación en sí o root puede escribir en el archivo que quiero, sin embargo.

El caso de uso en este escenario es copiar un archivo a una ubicación protegida en el dispositivo, no recuperarlo; Para recuperar, ya hay buenas respuestas en esta pregunta .

3 Solutions collect form web for “Copiar archivos en el shell de ADB con run-as”

El OP intentó combinar los siguientes 3 comandos (que no tuvo ningún problema para ejecutar uno tras otro en la sesión de shell interactiva) en un solo comando no interactivo:

 adb shell run-as com.example.app cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml 

Para simplificar, comencemos desde dentro de una sesión interactiva de adb shell . Si tratamos de combinar los dos últimos comandos en una sola línea:

 run-as com.example.app cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml 

Esto no funcionaría debido a cómo funciona la redirección de shell – sólo la parte cat /sdcard/temp_prefs.xml del comando se ejecutaría con com.example.app UID

Muchas personas "saben" para poner la parte del comando alrededor de la redirección entre comillas:

 run-as com.example.app "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml" 

Esto no funciona porque el comando run-as no es lo suficientemente inteligente para analizar todo el comando. Espera un ejecutable como el siguiente parámetro. La forma correcta de hacerlo sería usar sh lugar:

 run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml" 

¿Podemos tan apenas prepend la adb shell al comando y estar hecho con él? No necesariamente. Al ejecutar el comando desde su PC también agrega otro shell local y su analizador. Los requisitos de escape específicos dependerían de su sistema operativo. En Linux u OSX (si su comando ya no contiene ningún), es fácil citar el comando completo de la siguiente manera:

 adb shell 'run-as com.example.app sh -c "cat /sdcard/temp_prefs.xml > shared_prefs/com.example.app_preferences.xml"' 

Pero a veces es simplemente más fácil usar una solución alternativa con (-out o menos) cotizaciones:

 adb shell run-as com.example.app cp /sdcard/temp_prefs.xml shared_prefs/com.example.app_preferences.xml 

O si su dispositivo no tiene el comando cp :

 adb shell run-as com.example.app dd if=/sdcard/temp_prefs.xml of=shared_prefs/com.example.app_preferences.xml 

También observe cómo shared_prefs/com.example.app_preferences.xml lugar de full /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml – normalmente dentro del comando run-as su directorio actual es el HOME dir de su paquete.

Siguiendo los consejos de Chris Stratton, la forma en que eventualmente conseguí que esto funcionara fue la siguiente (para copiar preferencias compartidas de vuelta al dispositivo):

 adb push shared_prefs.xml /sdcard/temp_prefs.xml cat <<EOF | adb shell run-as com.example.app cat /sdcard/temp_prefs.xml > /data/data/com.example.app/shared_prefs/com.example.app_preferences.xml exit exit EOF 

Tuberías directamente a la adb shell run-as no funcionaba, y no sé por qué, pero la tubería a adb shell hace. El truco consiste en llamar a run-as desde la shell interactiva, y continúa aceptando la entrada de la canalización.

El documento AQUÍ me permite fácilmente incrustar las nuevas líneas para separar comandos y, en general, sólo lo hace legible; No tuve mucha suerte con puntos y comas, pero eso podría haber sido por la forma en que estaba haciendo las cosas. Creo que podría funcionar con otros métodos de canalización de múltiples comandos / newlines; Paré el experimento una vez que finalmente lo consiguió para trabajar.

Las dos salidas son necesarias para evitar una concha colgante (matable con CTRL-C); Uno para run-as , y el otro para la propia adb shell . El shell de Adb no responde al final del archivo muy bien, parece.

Usted podría apenas cambiar el permiso del directorio y después tirar de todos los archivos hacia fuera. Pero para mí estaba buscando sólo un archivo de preferencia compartida y pude obtener los datos como este:

 PACKAGE='com.mypackage.cool' SHAREDPREF_FILE="${PACKAGE}_preferences.xml" adb shell "run-as $PACKAGE cat /data/data/$PACKAGE/shared_prefs/$SHAREDPREF_FILE">$SHAREDPREF_FILE 

Ahora tenemos los datos del archivo de preferencia compartida almacenados en un archivo del mismo nombre.

  • Cómo obtener salida de los comandos de busybox en la aplicación de Android
  • Cambiar el usuario y el grupo de archivos de la aplicación de Android para replicar el problema que el usuario está teniendo
  • ¿Cómo puedo usar adb para desinstalar un APK de varios dispositivos conectados?
  • ¿Cómo desinstalar la propia aplicación de / system / app?
  • Android adb, recuperar base de datos utilizando run-as
  • ¿Dónde encontrar información sobre el comando de shell de "llamada de servicio" de Android?
  • Cómo ejecutar la aplicación C ++ en Android SHELL
  • Cómo leer las propiedades de Android con Java
  • Ejecutar comandos de shell y obtener resultados en un TextView
  • Android: Cambiar automáticamente el idioma del dispositivo sin reiniciar el dispositivo
  • Notificaciones de Android a través de ADB
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.