Est-il possible d'écrire dans le presse-papiers d'un appareil à l'aide d'ADB?

26

Je suis intéressé à apprendre à écrire dans le presse-papiers d'un appareil Android enraciné (et si possible à le lire).

J'espère le faire en utilisant ADB sur USB et je ne suis pas intéressé à installer des applications pour m'aider à le faire, car c'est quelque chose que je prévois de faire rarement.

Toute suggestion ou aide me guidant dans la bonne direction serait grandement appréciée.

EarthmeLon
la source
Pour tous ceux qui recherchent des approches plus faciles pour les émulateurs, voir ici: stackoverflow.com/questions/3391160/…
Mygod

Réponses:

21

Oui, vous pouvez réellement le faire. C'est un peu maladroit lorsque vous inspectez le presse-papiers, mais cela fonctionne très bien.

Tout d'abord, vous pouvez inspecter le contenu actuel du presse-papiers à service call clipboard 1partir d'un shell adb (ou, sans décortiquer en premier, adb shell service call clipboard 1). Il peut commencer initialement vierge après un redémarrage, par exemple:

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

Vous pouvez mettre du texte dans le presse-papiers à l'aide de service call clipboard 2, qui prend essentiellement 3 paramètres - deux entrées et la chaîne que vous souhaitez mettre dans le presse-papiers:

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

Pour être honnête, je ne sais pas quels sont les deux premiers paramètres. Une réponse sur Stack Overflow a suggéré que le premier entier est "nombre d'articles dans le colis" (un dans ce cas) et que le second est la longueur de la chaîne. Cependant, j'ai utilisé 0 pour le deuxième paramètre et cela fonctionne très bien, et je ne trouve aucune documentation qui correspond à cette fonction particulière ... alors prenez cela pour ce qu'il vaut.

Dans tous les cas, il s'agit essentiellement de créer un objet Parcel avec 3 champs, puis de le passer dans le presse-papiers. Le presse-papiers décompresse ensuite la parcelle et définit la valeur de chaîne transmise comme contenu du presse-papiers. Vous pouvez le voir lorsque vous allez récupérer la valeur par la suite:

# 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                   '........        ')
#

De même, si vous appuyez longuement sur un champ de saisie de texte et appuyez sur "Coller" après cela, vous obtiendrez le texte qui a été défini via la call service clipboard 2ligne ci-dessus (et il aura l'air tout à fait normal).

(Les exemples ci-dessus proviennent de mon HTC EVO, exécutant CyanogenMod 7)

eldarerathis
la source
1
Je peux enfin coller ma clé WPA et me connecter à mon routeur: D. Merci.
earthmeLon
3
@earthmeLon si vous essayez simplement de trouver un moyen simple de copier votre clé WPA, la prochaine fois, il vous sera peut-être plus facile de faire quelque chose comme vous l'envoyer par e-mail et copier / coller à partir d'un e-mail, ou copier un fichier texte le contenant sur votre périphérique via USB, puis ouvrez et copiez à partir de là. Il existe d'autres options comme le clavier Wifi qui vous permettent de taper (ou coller) à partir d'un PC et de le faire apparaître sur le téléphone.
GAThrawn
4
Ma clé WPA est sensible. Elle ne doit jamais être diffusée sur un réseau non local. Merci pour les suggestions @GAThrawn. Je trouverai éventuellement plus d'utilisation de cette fonctionnalité: D
earthmeLon
6
Je reçois '........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')en faisantcall service clipboard 2
cprcrack
3
Si vous avez besoin de copier votre mot de passe ou n'importe quel texte dans un champ de texte sur Android, vous pouvez également "abd shell input text 'String'" - J'ai abandonné dans le presse-papiers ...
Philippe
14

J'ai utilisé cette méthodologie, et cela a bien fonctionné en 4.x, mais a échoué pour moi en sucette. En cherchant une solution alternative, j'ai trouvé ceci: /programming/3391160/paste-text-on-android-emulator

ce n'est pas exactement comme vous le vouliez, mais pour moi, la plupart du temps, je veux copier du texte dans le presse-papiers parce que je veux le coller dans le champ du mot de passe.

en bonus supplémentaire, voici mon script ( édité le 24/04/2015 pour autoriser les espaces dans le texte ):

#!/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
la source
La raison pour laquelle vous devez échapper doublement la chaîne est qu'il existe deux shells: votre shell et le shell adb . Cependant, je soupçonne que cela échouera pour d'autres personnages qui ont une signification particulière dans le shell, comme l' esperluette .
Dan Dascalescu
Ce serait en fait la tâche d'adb shell de faire correctement cet échappement, mais apparemment, cela ne se fait pas complètement. Sur ma version (1.0.31), l'échappement d'espace utilisé ci-dessus n'est pas nécessaire, mais toutes sortes de caractères spéciaux devraient être échappés (mais il est impossible de le faire de manière fiable).
Matthijs Kooijman
Une meilleure façon de gérer les caractères spéciaux serait de passer par stdin, quelque chose comme: echo "$TEXT" | adb shell xargs -0 input textqui devrait gérer n'importe quel texte, à l'exception des caractères \ 0 (NUL). Malheureusement, les anciennes versions d'adb ne transmettent pas stdin à une commande spécifiée sur la ligne de commande adb. Ceci est corrigé dans les versions adb plus récentes, mais il a besoin d'Android N pour fonctionner .
Matthijs Kooijman
Quant à l'espace qui s'échappe, il est apparemment nécessaire pour la inputcommande sur l'appareil Android, pas pour le shell utilisé par adb shell. En outre, il n'est nécessaire que pour la version 22 et inférieure du SDK (Lollipop et ci-dessous, je crois) selon cette réponse .
Matthijs Kooijman
4

Voici une version améliorée du script par les galets ci-dessus. Comme avec ce script, il n'écrit pas dans le presse-papiers, mais envoie une entrée au champ de saisie actuellement focalisé, qui est souvent ce que vous voulez de toute façon.

Ce script est amélioré pour échapper les caractères spéciaux afin d'éviter de confondre le shell Android avec eux. Cela devrait permettre à toute chaîne d'être envoyée inchangée. Pour empêcher la readcommande d'interpréter une barre oblique inverse (de fin), j'ai ajouté -r ici.

Cela a été testé en utilisant la liste suivante de caractères spéciaux:

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

Voici le script:

#!/bin/bash
# Send text to android device using adb, emulating keyboard input.
# Based on a script from /android//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 /programming//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
la source
3

J'ai essayé et googlé un peu et il semble que l'approche du service de presse-papiers a cessé de fonctionner dans les androïdes plus récents, elle a échoué pour moi sur une version 4.4.4 d'Android. C'est-à-dire que vous aurez besoin d'une application pour obtenir l'accès au presse-papiers (lecture et écriture) depuis adb-shell. J'utilise clipper de majido sur github . L'apk est également hébergé, donc pas besoin de le compiler vous-même. Une fois installé, vous pouvez lui communiquer à l'aide de commandes de diffusion (l'application vous indiquera les commandes exactes). L'application ne nécessite pas de racine.

Sascha N.
la source
Comme nous ne savons pas quel est votre but: pourriez-vous s'il vous plaît modifier votre message et inclure ce que fait cette application, et comment on est censé l'utiliser? Les gens commencent déjà à signaler votre message comme "pas une réponse", car ils manquent évidemment le point que vous voulez faire valoir. Merci d'avance!
Izzy
clipper a mieux fonctionné pour moi que d'utiliser 'adb shell input text'. Encore mieux que le script Python AdbPaste github.com/gcb/AdbPaste pour envelopper le «texte d'entrée du shell adb». J'ai amélioré le clipper pour prendre en charge un paramètre de fichier, donc je peux maintenant envoyer plusieurs pages dans le presse-papiers en seulement une seconde ou deux. Code amélioré ici: github.com/RoundSparrow/clipper
RoundSparrow hilltx
0

Un autre script qui utilise adb shell inputpour envoyer des caractères peut être trouvé ici: https://github.com/gcb/AdbPaste

Il s'agit d'un script Python qui peut être cloné à partir de github, ou également téléchargé et exécuté directement:

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