Ist es möglich, mit ADB in die Zwischenablage eines Geräts zu schreiben?

26

Ich möchte lernen, wie man in die Zwischenablage eines verwurzelten Android-Geräts schreibt (und wenn möglich daraus liest).

Ich hoffe, dies mithilfe von ADB über USB tun zu können, und ich bin nicht daran interessiert, Apps zu installieren, die mir dabei helfen, da dies etwas ist, das ich selten vorhabe.

Anregungen oder Hilfe, die mich in die richtige Richtung leiten, wären sehr dankbar.

ErdeMeLon
quelle
Für alle, die nach einfacheren Ansätzen für Emulatoren suchen, siehe hier: stackoverflow.com/questions/3391160/…
Mygod

Antworten:

21

Ja, das können Sie tatsächlich. Es sieht etwas klobig aus, wenn Sie die Zwischenablage untersuchen, aber es funktioniert einwandfrei.

Zuallererst können Sie den aktuellen Inhalt der Zwischenablage mit service call clipboard 1einer AdB-Shell (oder, ohne vorher zu schälen adb shell service call clipboard 1) überprüfen . Es kann nach einem Neustart zunächst leer sein, zum Beispiel:

# service call clipboard 1
Result: Parcel(
  0x00000000: 00000000 00000001 00000000 00000000 '................'
  0x00000010: 00000000 00000000                   '........        ')
#

Sie können Text in die Zwischenablage service call clipboard 2einfügen, indem Sie 3 Parameter verwenden - zwei Zoll und die Zeichenfolge, die Sie in die Zwischenablage einfügen möchten:

# service call clipboard 2 i32 1 i32 0 s16 "Hi there"
Result: Parcel(00000000    '....')

Um ehrlich zu sein, bin ich mir nicht sicher, was die ersten beiden Parameter sind. Eine Antwort auf Stack Overflow hat ergeben, dass das erste int "Anzahl der Elemente im Paket" ist (eines in diesem Fall) und dass das zweite die Länge der Zeichenfolge ist. Ich habe jedoch 0 für den zweiten Parameter verwendet, und es funktioniert einwandfrei, und ich kann keine Dokumentation finden, die mit dieser bestimmten Funktion übereinstimmt. Nehmen Sie diese also für das, was sie wert ist.

In jedem Fall wird ein Parcel-Objekt mit drei Feldern erstellt und anschließend in die Zwischenablage übertragen. Die Zwischenablage entpackt dann das Paket und legt den als Inhalt der Zwischenablage übergebenen Zeichenfolgenwert fest. Sie können dies sehen, wenn Sie anschließend den Wert abrufen:

# service call clipboard 1
Result: Parcel(
  0x00000000: 00000000 00000001 00000000 00000008 '................'
  0x00000010: 00690048 00740020 00650068 00650072 'H.i. .t.h.e.r.e.'
  0x00000020: 00000000 00000000                   '........        ')
#

Wenn Sie lange auf ein Texteingabefeld drücken und anschließend auf "Einfügen" klicken, erhalten Sie den Text, der über die call service clipboard 2obige Zeile eingegeben wurde (und er sieht ganz normal aus).

(Die obigen Beispiele stammen von meinem HTC EVO mit CyanogenMod 7)

eldarerathis
quelle
1
Ich kann endlich meinen WPA-Schlüssel einfügen und eine Verbindung zu meinem Router herstellen: D. Vielen Dank.
EarthMeLon
3
@earthmeLon Wenn Sie nur versucht haben, einen einfachen Weg zum Kopieren Ihres WPA-Schlüssels zu finden, ist es beim nächsten Mal möglicherweise einfacher, sich etwas per E-Mail zu schicken und aus einer E-Mail zu kopieren / einfügen oder eine Textdatei zu kopieren, die diesen Schlüssel enthält Gerät über USB, dann öffnen und von dort kopieren. Es gibt andere Optionen wie die Wifi-Tastatur , mit der Sie von einem PC aus Text eingeben (oder einfügen) und auf dem Telefon anzeigen lassen können.
GAThrawn
4
Mein WPA-Schlüssel ist empfindlich. Es sollte NIEMALS über ein nicht lokales Netzwerk gesendet werden. Danke für die Vorschläge @GAThrawn. Ich werde irgendwann mehr Verwendung für diese Funktionalität finden: D
earthmeLon
6
Ich bekomme '........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')bei der Herstellungcall service clipboard 2
cprcrack
3
Falls Sie Ihr Passwort oder einen beliebigen Text in ein Textfeld auf Android kopieren müssen, können Sie auch "abd shell input text 'String'" - Ich habe auf die Zwischenablage verzichtet ...
Philippe
14

Ich habe diese Methode verwendet und sie hat in 4.x einwandfrei funktioniert, bei Lollipop ist sie jedoch fehlgeschlagen. Auf der Suche nach einer alternativen Lösung habe ich Folgendes gefunden: https://stackoverflow.com/questions/3391160/paste-text-on-android-emulator

Es ist nicht genau so, wie Sie es wollten, aber für mich selbst ist es das meiste Mal, wenn ich Text in die Zwischenablage kopieren möchte, weil ich ihn in das Passwortfeld einfügen möchte.

Als zusätzlichen Bonus gibt es hier mein Skript ( bearbeitet am 24.04.2015, um Leerzeichen im Text zuzulassen ):

#!/bin/bash

if [[ "$1" != "" ]]
then
    TEXT=$1
else
    read -s -p "Enter text you want to insert: " TEXT
fi

ESCAPED_TEXT=`echo $TEXT | sed "s/\s/\%s/g"`
adb shell input text "$ESCAPED_TEXT"
Galets
quelle
Der Grund, warum Sie die Zeichenfolge doppelt maskieren müssen, ist, dass es zwei Shells gibt: Ihre Shell und die ADB-Shell . Ich vermute jedoch, dass dies für andere Zeichen, die in der Shell eine besondere Bedeutung haben, wie das kaufmännische Und- Zeichen, fehlschlagen wird .
Dan Dascalescu
Es wäre eigentlich die Aufgabe von adb shell, dies korrekt zu tun, aber anscheinend ist es nicht vollständig. In meiner Version (1.0.31) wird das oben verwendete Leerzeichen nicht benötigt, aber alle Arten von Sonderzeichen müssen maskiert werden (dies ist jedoch nicht zuverlässig möglich).
Matthijs Kooijman
Eine bessere Möglichkeit, mit Sonderzeichen umzugehen, besteht darin, durch stdin zu echo "$TEXT" | adb shell xargs -0 input textleiten. Dabei sollte jeder Text außer \ 0 (NUL) Zeichen verarbeitet werden. Leider leiten ältere adb-Versionen stdin nicht an einen in der adb-Befehlszeile angegebenen Befehl weiter. Dies ist in neueren adb-Versionen behoben, aber es benötigt Android N, um zu funktionieren .
Matthijs Kooijman
Der entweichende Speicherplatz wird anscheinend für den inputBefehl auf dem Android-Gerät benötigt, nicht für die von verwendete Shell adb shell. Außerdem wird es laut dieser Antwort nur für SDK-Version 22 und niedriger (Lollipop und niedriger, glaube ich) benötigt .
Matthijs Kooijman
4

Hier ist eine verbesserte Version des Skripts von Galets oben. Wie bei diesem Skript wird nicht in die Zwischenablage geschrieben, sondern es werden Eingaben in das aktuell fokussierte Eingabefeld gesendet, was häufig sowieso gewünscht wird.

Dieses Skript wurde verbessert, um Sonderzeichen zu vermeiden und die Android-Shell nicht damit zu verwechseln. Dadurch sollte es möglich sein, dass eine beliebige Zeichenfolge unverändert gesendet wird. Um zu verhindern, dass der readBefehl einen (nachgestellten) Backslash interpretiert, habe ich dort -r hinzugefügt.

Dies wurde anhand der folgenden Liste von Sonderzeichen getestet:

./adb-send-string ' \`~!@#$%^&*()-_=+[{]}|;:",<.>/?'\'

Hier ist das Skript:

#!/bin/bash
# Send text to android device using adb, emulating keyboard input.
# Based on a script from https://android.stackexchange.com/a/105881/223695
# extended to support special characters

if [[ "$1" != "" ]]
then
    TEXT="$1"
else
    read -s -r -p "Enter text you want to insert: " TEXT
fi

escape() {
    # Encapsulate the string in $'', which enables interpretation of
    # \xnn escapes in the string. This is not POSIX-sh, but an extension
    # documented by bash and also supported by the Android sh.
    echo -n "$'"

    # Process each character in $1 one by one
    for (( i=0 ; i<${#1}; i++ )); do
        # Extract the i'th character
        C="${1:$i:1}"
        if [ "$C" = ' ' ]; then
            # Encode spaces as %s, which is needed for Android's
            # "input text" command below 6.0 Marshmellow
            # See https://stackoverflow.com/documentation/android/9408/adb-shell/3958/send-text-key-pressed-and-touch-events-to-android-device-via-adb
            echo -n '%s'
        else
            # Encode everything else as \xnn, to prevent them from being
            # interpreted by the Android shell
            printf '\\x%02x' "'$C"
        fi
    done
    # Terminate the $''
    echo -n "'"
}

ESCAPED_TEXT=`escape "$TEXT"`
adb shell input text "$ESCAPED_TEXT"
Matthijs Kooijman
quelle
3

Ich habe ein wenig versucht und gegoogelt und es scheint, dass der Call-Service-Clipboard-Ansatz in neueren Androids nicht mehr funktioniert, er ist für mich auf einer 4.4.4-Version von Android fehlgeschlagen. Dh Sie benötigen eine App, um Zugriff auf die Zwischenablage (Lesen und Schreiben) von adb-shell zu erhalten. Ich benutze Clipper von Majido auf Github . Das apk wird ebenfalls gehostet, so dass Sie es nicht selbst kompilieren müssen. Nach der Installation können Sie mit Broadcast-Befehlen kommunizieren (die App teilt Ihnen die genauen Befehle mit). App benötigt kein root.

Sascha N.
quelle
Da wir nicht wissen, was Ihr Zweck ist: Könnten Sie bitte Ihren Beitrag bearbeiten und angeben, was diese App tut und wie man sie verwenden soll? Die Leute markieren Ihren Beitrag bereits als "keine Antwort", da sie offensichtlich den Punkt verfehlen, den Sie ansprechen möchten. Danke im Voraus!
Izzy
clipper hat bei mir besser funktioniert als mit 'adb shell input text'. Noch besser als das Python-Skript AdbPaste github.com/gcb/AdbPaste zum Umbrechen von 'Adb-Shell-Eingabetext'. Ich habe clipper erweitert, um einen Dateiparameter zu unterstützen, sodass ich jetzt in nur ein oder zwei Sekunden mehrere Seiten in die Zwischenablage senden kann. Verbesserter Code hier: github.com/RoundSparrow/clipper
RoundSparrow hilltx
0

Ein weiteres Skript adb shell inputzum Senden von Zeichen finden Sie hier: https://github.com/gcb/AdbPaste

Dies ist ein Python-Skript, das von Github geklont oder auch direkt heruntergeladen und ausgeführt werden kann:

$ wget https://github.com/gcb/AdbPaste/raw/master/AdbPaste.py
$ chmod a+x AdbPaste.py
$ ./AdbPaste.py "some text to paste"
Matthijs Kooijman
quelle