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 demonio adb disponible. Existe el comando mv pero rechaza trabajar si source está en un dispositivo de solo lectura.

  1. ¿Qué hacer si tengo que copiar algunos directorios de un dispositivo de solo lectura recursivamente?
  2. ¿Cómo cambiar una línea en un archivo de texto (por ejemplo, "PATH=/cache" para que sea "PATH=/mnt/asec") ?
Author: psihodelia, 2011-01-17

8 answers

La respuesta más común a eso es simple: Paquete de pocas aplicaciones (busybox?) con tu APK (suponiendo que quieras usarlo dentro de una aplicación). Por lo que sé, la partición /data no está montada en noexec, e incluso si no desea implementar un APK en toda regla, 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 usar crosstool-ng y construir un conjunto de herramientas enlazadas estáticamente (enlazadas contra uClibc). Le puede ser grande, pero definitivamente funcionarán.

 16
Author: p_l,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-31 02:21:20

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

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

 88
Author: gnclmorais,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-26 15:08:30

Puedes hacerlo sin permisos de root:

cat srcfile > /mnt/sdcard/dstfile
 29
Author: Viriatvs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-09 16:08:20

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

 9
Author: kubo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-30 10:52:56

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

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

 4
Author: jmbouffard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-01 21:05:55

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

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

copy-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í proporciono la fuente de un ligero find para Android porque en algunos dispositivos esta utilidad falta. En lugar de myfind se puede usar find, si se define en el dispositivo.

Instalación:

$ adb push copy-r /sdcard/

Corriendo dentro de adb shell (rooteado):

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

O

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

(El hash # anterior es el prompt su, mientras que . es el comando que hace que el shell ejecute el archivo especificado, casi lo mismo que source).

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

Escribir archivos en el directorio de la aplicación era más complicado, traté de establecer permisos r / w en files y sus subdirectorios, no funcionó (bien, me permitió leer, pero no escribir, lo cual 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 necesite el código para desproteger los directorios de la aplicación para habilitar adb shell el acceso en un teléfono no rooteado,

        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, podía leer pero no escribir.

 3
Author: 18446744073709551615,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-11 14:00:18

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

 2
Author: Diego Torres Milano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-18 03:43:16

Podría sugerir simplemente instalar Terminal-ide en su dispositivo que está disponible en play market. Es gratis, no requiere root y proporciona un entorno conveniente *nix como cp, find, du, mc y muchas otras utilidades que se instalan en forma binaria con un toque de botón.

 0
Author: Hubbitus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-27 19:15:04