¿Cómo copiar y editar archivos en Android shell?

El shell de Android no tiene el comando cp . Android shell también no tiene sed o grep o vi . No tengo ningún daemon adb disponible. Hay mv comando pero rechaza trabajar si fuente está en un dispositivo de sólo lectura.

  1. ¿Qué debo hacer si tengo que copiar recursivamente algunos directorios de un dispositivo de sólo lectura?
  2. Cómo cambiar una línea en un archivo de texto (por ejemplo, "PATH = / cache" para ser "PATH = / mnt / asec")?

La respuesta más común a eso es simple: Paquete de pocas aplicaciones (busybox?) Con su APK (suponiendo que desee utilizarlo en una aplicación). Por lo que sé, la partición / data no está montada noexec, e incluso si no desea implementar un APK completo, podría modificar las fuentes de ConnectBot para construir un APK con un conjunto de herramientas de línea de comandos incluidas.

Para las herramientas de línea de comandos, recomiendo el uso de crosstool-ng y la construcción de un conjunto de herramientas vinculadas estáticamente (vinculado a uClibc). Pueden ser grandes, pero definitivamente funcionarán.

Para copiar dirs, parece que puede usar adb pull <remote> <local> si desea copiar el archivo / dir desde el dispositivo y adb push <local> <remote> para copiar el archivo / dir al dispositivo. Alternativamente, sólo para copiar un archivo, puede usar un simple truco: cat source_file > dest_file . Tenga en cuenta que esto no funciona para las rutas inaccesibles por el usuario.

Para editar archivos, no he encontrado una solución simple, sólo algunas posibles soluciones. Pruebe esto , parece que puede (después de la configuración) utilizarlo para editar archivos como busybox vi <filename> . Nano parece ser posible de usar también.

Puede hacerlo sin permisos de root:

 cat srcfile > /sdcard/dstfile 

Puede utilizar cat > filename para utilizar la entrada estándar para escribir en el archivo. Al final hay que poner EOF CTRL+D

También si el objetivo es sólo para acceder a los archivos en el teléfono. Hay un Explorador de archivos al que se puede acceder desde la perspectiva de DDMS de Eclipse. Le permite copiar archivos desde y hacia el dispositivo. Así que siempre puede obtener el archivo, modificarlo y volver a ponerlo en el dispositivo. Por supuesto, permite acceder sólo a los archivos que no están protegidos por lectura.

Si no ve el Explorador de archivos, desde la perspectiva de DDMS, vaya en "Ventana" -> "Mostrar vista" -> "Explorador de archivos".

Dado que la directiva de permisos en mi dispositivo es un poco paranoica (no puedo adb pull datos de aplicación de adb pull ), escribí un script para copiar los archivos recursivamente.

Nota: este archivo recursivo / script de copia de carpeta está destinado a Android!

Copia-r :

 #! /system/bin/sh src="$1" dst="$2" dir0=`pwd` myfind() { local fpath=$1 if [ -e "$fpath" ] then echo $fpath if [ -d "$fpath" ] then for fn in $fpath/* do myfind $fn done fi else : echo "$fpath not found" fi } if [ ! -z "$dst" ] then if [ -d "$src" ] then echo 'the source is a directory' mkdir -p $dst if [[ "$dst" = /* ]] then : # Absolute path else # Relative path dst=`pwd`/$dst fi cd $src echo "COPYING files and directories from `pwd`" for fn in $(myfind .) do if [ -d $fn ] then echo "DIR $dst/$fn" mkdir -p $dst/$fn else echo "FILE $dst/$fn" cat $fn >$dst/$fn fi done echo "DONE" cd $dir0 elif [ -f "$src" ] then echo 'the source is a file' srcn="${src##*/}" if [ -z "$srcn" ] then srcn="$src" fi if [[ "$dst" = */ ]] then mkdir -p $dst echo "copying $src" '->' "$dst/$srcn" cat $src >$dst/$srcn elif [ -d "$dst" ] then echo "copying $src" '->' "$dst/$srcn" cat $src >$dst/$srcn else dstdir=${dst%/*} if [ ! -z "$dstdir" ] then mkdir -p $dstdir fi echo "copying $src" '->' "$dst" cat $src >$dst fi else echo "$src is neither a file nor a directory" fi else echo "Use: copy-r src-dir dst-dir" echo "Use: copy-r src-file existing-dst-dir" echo "Use: copy-r src-file dst-dir/" echo "Use: copy-r src-file dst-file" fi 

Aquí ofrezco la fuente de un find ligero para Android porque en algunos dispositivos esta utilidad falta. En lugar de myfind uno puede utilizar find , si se define en el dispositivo.

Instalación:

 $ adb push copy-r /sdcard/ 

Corriendo en adb shell (enraizado):

 # . /sdcard/copy-r files/ /sdcard/files3 

o

 # source /sdcard/copy-r files/ /sdcard/files3 

(El hash # arriba es el indicador su , mientras que . Es el comando que hace que el shell ejecute el archivo especificado, casi igual que source ).

Después de copiar, puedo adb pull los archivos de la tarjeta sd.

Escribir archivos en el directorio de la aplicación fue más complicado, traté de establecer permisos r / w en los files y sus subdirectorios, no funcionó (bueno, me permitió leer, pero no escribir, lo que es extraño), así que tuve que hacer :

  String[] cmdline = { "sh", "-c", "source /sdcard/copy-r /sdcard/files4 /data/data/com.example.myapp/files" }; try { Runtime.getRuntime().exec(cmdline); } catch (IOException e) { e.printStackTrace(); } 

En la aplicación onCreate () .

PS en caso de que alguien necesita el código para desproteger los directorios de la aplicación para habilitar el acceso de adb shell en un teléfono no enraizado,

  setRW(appContext.getFilesDir().getParentFile()); public static void setRW(File... files) { for (File file : files) { if (file.isDirectory()) { setRW(file.listFiles()); // Calls same method again. } else { } file.setReadable(true, false); file.setWritable(true, false); } } 

Aunque por alguna razón desconocida pude leer pero no escribir.

Si tiene acceso root, instale busybox ( google para instrucciones ).

Podría sugerir sólo instalar Terminal-ide en su dispositivo que disponible en el mercado de juego . Su libre, no requiere de raíz y proporcionar conveniente * nix entorno como cp, find, du, mc y muchas otras utilidades que se instala en forma binaria por un toque de botón.

  • ¿Cómo ejecuto un binario compilado en Android?
  • Compruebe si el directorio existe en Android sdcard con bash
  • ¿Por qué el comando SQLite 3 que usa la shell ADB de Android devuelve "permiso denegado"?
  • ¿Cómo averiguar los nombres de las actividades en un paquete? androide. Shell ADB
  • Enviar texto no inglés usando adb (input keyevent) o usando monkeyrunner
  • Error al cargar la biblioteca nativa 'libnative-platform.so' para Linux amd64
  • ¿Cómo resolver el dispositivo ADB no autorizado en Android dispositivo ADB host?
  • ¿Cómo desactivar el Wifi a través de ADB?
  • interpretando dumpsys cpuinfo
  • Cómo detectar la aplicación en ejecución mediante el comando ADB
  • Múltiples comandos a través de Jsch Shell
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.