¿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.
- ¿Qué debo hacer si tengo que copiar recursivamente algunos directorios de un dispositivo de sólo lectura?
- Cómo cambiar una línea en un archivo de texto (por ejemplo, "PATH = / cache" para ser "PATH = / mnt / asec")?
- Obtener Android versión del sistema operativo del dispositivo conectado a través de adb
- ¿Ejecutar comandos de Shell a través de código java en Android?
- Utilizar shell de adb de android para devolver una actividad
- Adb shell su funciona, pero la raíz adb no
- Controla el LED Android desde el shell
- Cómo usar el mono androide
- ¿Cómo ejecutar la aplicación del sistema android sin autorización de la raíz?
- Android: cómo ejecutar un comando de shell desde dentro del código
- ¿Existe un equivalente a 'adb shell texto de teclado de entrada' para iOS?
- Repo: comando no encontrado en la secuencia de comandos automatizada bash para crear cyanogenmod
- Cambiar permiso de archivo en la aplicación
- ¿Es posible iniciar la actividad a través de adb shell y recibir su respuesta?
- Cómo empujar las carpetas de la computadora en sdcard usando adb shell
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.