Czy można pisać do schowka urządzenia za pomocą ADB?

26

Jestem zainteresowany nauczeniem się, jak pisać (i jeśli to możliwe, czytać) w schowku zrootowanego urządzenia z Androidem.

Mam nadzieję, że zrobię to przy użyciu ADB przez USB i nie jestem zainteresowany instalacją żadnych aplikacji, które by mi to pomogły, ponieważ rzadko planuję to robić.

Wszelkie sugestie lub wskazówki, które poprowadzą mnie we właściwym kierunku, będą mile widziane.

earthmeLon
źródło
Dla każdego, kto szuka łatwiejszych podejść do emulatorów, zobacz tutaj: stackoverflow.com/questions/3391160/…
Mygod

Odpowiedzi:

21

Tak, możesz to zrobić. Podczas przeglądania schowka wygląda to trochę nieprzyzwoicie, ale działa dobrze.

Po pierwsze, możesz sprawdzić bieżącą zawartość schowka za service call clipboard 1pomocą powłoki adb (lub, bez uprzedniej powłoki adb shell service call clipboard 1). Może początkowo być pusty po ponownym uruchomieniu, na przykład:

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

Możesz wstawić tekst do schowka service call clipboard 2, który w zasadzie zajmuje 3 parametry - dwie liczby całkowite i ciąg znaków, który chcesz umieścić w schowku:

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

Szczerze mówiąc, nie jestem pewien, jakie są pierwsze dwa parametry. Jedna odpowiedź na temat przepełnienia stosu sugeruje, że pierwszą liczbą całkowitą jest „liczba elementów w paczce” (jedna w tym przypadku), a drugą jest długość łańcucha. Jednak użyłem 0 dla drugiego parametru i działa dobrze i nie mogę znaleźć żadnej dokumentacji, która pasowałaby do tej konkretnej funkcji ... więc weź to za to, co jest warte.

W każdym razie zasadniczo tworzy obiekt Parcel z 3 polami, a następnie przekazuje go do schowka. Schowek następnie rozpakowuje działkę i ustawia wartość ciągu przekazywaną jako zawartość schowka. Możesz to zobaczyć, gdy później pobierzesz wartość:

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

Podobnie, jeśli naciśniesz długo pole wprowadzania tekstu i klikniesz „Wklej” po wykonaniu tej czynności, otrzymasz tekst ustawiony za pomocą call service clipboard 2powyższej linii (i będzie wyglądał zupełnie normalnie).

(Powyższe przykłady pochodzą z mojego HTC EVO z systemem CyanogenMod 7)

eldarerathis
źródło
1
W końcu mogę wkleić mój klucz WPA i połączyć się z routerem: D. Dziękuję Ci.
earthmeLon
3
@earthmeLon, jeśli tylko próbujesz znaleźć prosty sposób na skopiowanie klucza WPA, następnym razem możesz łatwiej zrobić coś takiego, jak wysłać go do siebie i skopiować / wkleić z wiadomości e-mail lub skopiować plik tekstowy zawierający go na swój urządzenie przez USB, a następnie otwórz i skopiuj stamtąd. Istnieją inne opcje, takie jak klawiatura Wi-Fi, które pozwalają pisać (lub wklejać) z komputera i wyświetlać je na telefonie.
GAThrawn
4
Mój klucz WPA jest wrażliwy. Nie powinien być nadawany przez żadną nielokalną sieć EVER. Dzięki za sugestie @GAThrawn. W końcu znajdę więcej zastosowań dla tej funkcjonalności: D
earthmeLon
6
Dostaję '........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')przy robieniucall service clipboard 2
cprcrack
3
W przypadku, gdy musisz skopiować hasło lub dowolny tekst do pola tekstowego na Androidzie, możesz także „wprowadzić tekst powłoki abd„ String ”” - zrezygnowałem ze schowka ...
Philippe
14

Użyłem tej metodologii, która działała dobrze w wersji 4.x, ale w Lollipopie zakończyła się niepowodzeniem. Szukając alternatywnego rozwiązania, znalazłem to: /programming/3391160/paste-text-on-android-emulator

nie jest dokładnie tak, jak tego chciałeś, ale dla mnie najczęściej chcę skopiować tekst do schowka, ponieważ chcę go wkleić w polu hasła.

jako dodatkowy bonus, oto mój skrypt ( edytowany 24.04.2015, aby umożliwić spacje w tekście ):

#!/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"
galety
źródło
Powodem, dla którego musisz podwójnie uciec z łańcucha, jest to, że istnieją dwie powłoki: twoja i adb . Podejrzewam jednak, że to się nie powiedzie w przypadku innych postaci, które mają specjalne znaczenie w powłoce, takich jak znak ampersand .
Dan Dascalescu,
Właściwie to zadanie powłoki adb byłoby właściwie zrobić to ucieczkę, ale najwyraźniej nie do końca. W mojej wersji (1.0.31) użyte powyżej znaki odstępu nie są potrzebne, ale wszystkie znaki specjalne wymagają ucieczki (ale nie można tego zrobić niezawodnie).
Matthijs Kooijman,
Lepszym sposobem radzenia sobie ze znakami specjalnymi byłoby przepuszczanie standardowego wejścia, coś w rodzaju: echo "$TEXT" | adb shell xargs -0 input textKtóre powinno obsługiwać dowolny tekst, z wyjątkiem znaków \ ​​0 (NUL). Niestety starsze wersje adb nie przekazują standardowego wejścia do polecenia określonego w wierszu polecenia adb. Zostało to poprawione w nowszych wersjach ADB ale potrzebuje Android N do pracy .
Matthijs Kooijman,
Jeśli chodzi o ucieczkę miejsca, jest to najwyraźniej potrzebne dla inputpolecenia na urządzeniu z Androidem, a nie dla powłoki używanej przez adb shell. Jest również potrzebny tylko dla SDK w wersji 22 i niższej (wierzę, że Lollipop i poniżej) zgodnie z tą odpowiedzią .
Matthijs Kooijman,
4

Oto ulepszona wersja skryptu przez galety powyżej. Podobnie jak w przypadku tego skryptu, nie zapisuje do schowka, ale wysyła dane wejściowe do aktualnie skupionego pola wejściowego, które i tak często jest pożądane.

Ten skrypt został ulepszony, aby uciec od znaków specjalnych, aby zapobiec pomyleniu z nimi powłoki Androida. To powinno pozwolić na wysłanie dowolnego łańcucha bez zmian. Aby zapobiec readinterpretacji polecenia (końcowego) ukośnika odwrotnego, dodałem tam -r.

Zostało to przetestowane przy użyciu następującej listy znaków specjalnych:

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

Oto skrypt:

#!/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
źródło
3

Próbowałem trochę i przejrzałem google i wydaje się, że podejście do obsługi połączeń przestało działać w nowszych androidach, nie udało mi się to na Androidzie w wersji 4.4.4. Czyli potrzebujesz aplikacji, aby uzyskać dostęp do schowka (odczyt i zapis) z powłoki adb. Używam maszynki do strzyżenia z majido na github . APK jest również hostowany, więc nie musisz go kompilować samodzielnie. Po zainstalowaniu możesz się z nim komunikować za pomocą poleceń rozgłoszeniowych (aplikacja poda dokładne polecenia). Aplikacja nie wymaga rootowania.

Sascha N.
źródło
Ponieważ nie wiemy, jaki jest twój cel: czy możesz edytować swój post i dołączyć do niego to, co robi ta aplikacja, i jak należy z niej korzystać? Ludzie już zaczynają oznaczać Twój post jako „brak odpowiedzi”, ponieważ najwyraźniej brakuje mu punktu, który chcesz zrobić. Z góry dziękuję!
Izzy
Clipper działał dla mnie lepiej niż przy użyciu „tekstu wejściowego powłoki adb”. Nawet lepiej niż skrypt AdbPaste AdBPaste github.com/gcb/AdbPaste do zawijania „tekstu wejściowego powłoki adb”. Ulepszyłem program Clipper, aby obsługiwał parametr pliku, dzięki czemu mogę teraz wysyłać wiele stron do schowka w ciągu sekundy lub dwóch. Ulepszony kod tutaj: github.com/RoundSparrow/clipper
RoundSparrow hilltx
0

Inny skrypt służący adb shell inputdo wysyłania znaków można znaleźć tutaj: https://github.com/gcb/AdbPaste

To jest skrypt w języku Python, który można klonować z github lub bezpośrednio pobrać i uruchomić:

$ wget https://github.com/gcb/AdbPaste/raw/master/AdbPaste.py
$ chmod a+x AdbPaste.py
$ ./AdbPaste.py "some text to paste"
Matthijs Kooijman
źródło