it-swarm.com.de

Wie kopiere und bearbeite ich Dateien in der Android-Shell?

Die Android Shell verfügt nicht über den Befehl cp . Android Shell hat auch keine sed oder grep oder vi . Ich habe keinen adb daemon verfügbar. Es gibt den Befehl mv , der jedoch nicht funktioniert, wenn sich die Quelle auf einem schreibgeschützten Gerät befindet. 

  1. Was ist zu tun, wenn ich einige Verzeichnisse rekursiv von einem schreibgeschützten Gerät kopieren muss? 
  2. Wie kann man eine Zeile in einer Textdatei ändern (z. B. "PATH =/cache" in "PATH =/mnt/asec")?
63
psihodelia

Die häufigste Antwort darauf ist einfach: Bündeln Sie einige Apps (busybox?) Mit Ihrem APK (vorausgesetzt, Sie möchten es in einer Anwendung verwenden). Soweit ich weiß, ist die/data-Partition noexec nicht gemountet. Selbst wenn Sie keine vollwertige APK bereitstellen möchten, können Sie die ConnectBot-Quellen so ändern, dass eine APK mit einer Reihe von Befehlszeilentools erstellt wird.

Für Befehlszeilentools empfehle ich die Verwendung von crosstool-ng und das Erstellen eines Satzes von statisch verknüpften Tools (verbunden mit uClibc). Sie sind vielleicht groß, aber sie werden definitiv funktionieren.

16
p_l

Um Verzeichnisse zu kopieren, können Sie anscheinend adb pull <remote> <local> verwenden, wenn Sie Datei/Verzeichnisverzeichnis von Gerät kopieren möchten, und adb Push <local> <remote>, um Datei/Verzeichnisverzeichnis auf Gerät zu kopieren. Um eine Datei zu kopieren, können Sie alternativ einen einfachen Trick verwenden: cat source_file > dest_file. Beachten Sie, dass dies nicht für von Benutzern nicht zugängliche Pfade funktioniert.

Zum Bearbeiten von Dateien habe ich keine einfache Lösung gefunden, sondern nur einige mögliche Problemumgehungen. Versuchen Sie es mit this , es scheint, dass Sie (nach dem Setup) Dateien wie busybox vi <filename> bearbeiten können. Nano scheint auch kann verwendet werden .

89
gnclmorais

Sie können dies auch ohne Root-Berechtigungen tun:

cat srcfile > /mnt/sdcard/dstfile
31
Viriatvs

Sie können cat > filename verwenden, um die Standardeingabe zum Schreiben in die Datei zu verwenden. Am Ende müssen Sie EOF CTRL+D eingeben.

9
kubo

Auch wenn das Ziel ist, nur auf die Dateien auf dem Telefon zuzugreifen. Es gibt einen Datei-Explorer, auf den aus der Eclipse-DDMS-Perspektive zugegriffen werden kann. Damit können Sie Dateien vom und zum Gerät kopieren. So können Sie die Datei jederzeit abrufen, ändern und wieder auf dem Gerät ablegen. Natürlich kann nur auf die Dateien zugegriffen werden, die nicht gelesen werden.

Wenn Sie den Datei-Explorer nicht sehen, gehen Sie aus der DDMS-Perspektive in "Fenster" -> "Ansicht" -> "Datei-Explorer".

4
jmbouffard

Da die Berechtigungsrichtlinie auf meinem Gerät etwas paranoid ist (Anwendungsdaten können nicht adb pull), habe ich ein Skript geschrieben, um Dateien rekursiv zu kopieren.

Hinweis: Dieses rekursive Skript zum Kopieren von Dateien/Ordnern ist für Android bestimmt!

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

Hier gebe ich die Quelle einer leichtgewichtigen find für Android an, da auf einigen Geräten dieses Dienstprogramm fehlt. Anstelle von myfind kann find verwendet werden, wenn es auf dem Gerät definiert ist.

Installation:

$ adb Push copy-r /sdcard/

Läuft innerhalb von adb Shell (gerootet):

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

oder

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

(Der Hashcode # oben ist die Eingabeaufforderung su, während . der Befehl ist, der die Shell dazu veranlasst, die angegebene Datei auszuführen, fast genauso wie source).

Nach dem Kopieren kann ich die Dateien von der SD-Karte adb pull.

Das Schreiben von Dateien in das App-Verzeichnis war schwieriger. Ich habe versucht, für files und seine Unterverzeichnisse r/w-Berechtigungen zu setzen. Es funktionierte nicht (gut, ich konnte lesen, aber nicht schreiben, was seltsam ist), also musste ich das tun :

        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();
        }

in der Anwendung onCreate () .

PS nur für den Fall, dass jemand den Code zum Aufheben des Schutzes der Anwendungsverzeichnisse benötigt, um den Zugriff auf adb Shell auf einem nicht gerooteten Telefon zu ermöglichen. 

        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);
        }
    }

obwohl ich aus unbekannten Gründen lesen konnte, aber nicht schreiben konnte.

Wenn Sie über Root-Zugriff verfügen, installieren Sie busybox ( google für Anweisungen ).

2

Android unterstützt den Befehl dd.

dd if=/path/file of=/path/file
1
jrc

Ich könnte vorschlagen, einfach Terminal-ide auf Ihrem Gerät die verfügbaren im Spielemarkt zu installieren. Es ist kostenlos, erfordert kein Root-Verzeichnis und bietet eine komfortable * nix-Umgebung wie cp, find, du, mc und viele andere Dienstprogramme, die in binärer Form mit einem einzigen Tastendruck installiert werden.

1
Hubbitus

Ich habe versucht, auf Mac zu folgen.

  1. Starten Sie das Terminal und wechseln Sie in den Ordner, in dem sich adb befindet. Auf dem Mac normalerweise um /Library/Android/sdk/platform-tools.
  2. Verbinden Sie das Gerät jetzt mit eingeschaltetem Entwicklermodus und überprüfen Sie den Gerätestatus mit dem Befehl ./adb status. "./" soll "adb" vorangestellt werden.
  3. Jetzt müssen wir möglicherweise den Zielordner auf unserem Gerät kennen. Sie können dies mit adb Shell überprüfen. Verwenden Sie den Befehl ./adb Shell, um eine Adb-Shell einzugeben. Jetzt haben wir mit Shell Zugriff auf den Ordner des Geräts.
  4. Sie können alle Ordner mit dem Befehl ls -la auflisten.
  5. Normalerweise finden wir einen Ordner /sdcard in unserem Gerät. (Sie können hier jeden Ordner auswählen.) Angenommen, mein Ziel ist /sdcard/3233-3453/DCIM/Videos und die Quelle ist ~/Documents/Videos/film.mp4.
  6. Jetzt können wir adb Shell beenden, um auf das Dateisystem auf unserer Maschine zuzugreifen. Befehl: ./adb exit 
  7. Jetzt ./adb Push [source location] [destination location]
    ./adb Push ~/Documents/Videos/film.mp4 /sdcard/3233-3453/DCIM/Videos
  8. Voila.
0
Jose

Wenn Sie nur eine Datei anhängen möchten, z. Um einer Konfigurationsdatei einige Zeilen hinzuzufügen, reichen integrierte Shell-Befehle aus:

adb Shell
cat >> /path/to/file <<EOF
some text to append
a second line of text to append
EOF
exit

Ersetzen Sie oben /path/to/file durch die Datei, die Sie bearbeiten möchten. Sie benötigen Schreibrechte für die Datei, was Root-Zugriff impliziert, wenn Sie eine Systemdatei bearbeiten. Zweitens ersetzen Sie some text to append und a second line of text to append durch die Zeilen, die Sie hinzufügen möchten.

0
bleater