Inleiding
Bij het inrichten of aanpassen van een Android smartphone komt het met enige regelmaat voor, dat je lange en vaak complexe tekenreeksen moet invoeren op het armzalige schermtoetsenbord van de telefoon in kwestie. Denk daarbij bijvoorbeeld aan wachtwoorden van e-mailaccounts of een WLAN-wachtwoord. Zou het niet prachtig zijn als je dit met behulp van een computertoetsenbord zou kunnen doen? Eventueel nog verder vereenvoudigd door gebruik making van een klembord (kopiëren en plakken)? Gelukkig behoort dit alles tot de mogelijkheden, als je de telefoon via USB met de computer verbindt!
ADB
De afkorting ADB
staat voor Android Debug Bridge, een stukje software dat
een verbinding (brug) legt tussen een Android-systeem enerzijds en een computer
anderzijds. Het maakt van begin af aan deel uit van Google's Android-ontwikkeltools
en wordt vaak gebruikt tijdens de ontwikkeling van apps en aangepaste firmware,
zogenaamde Custom ROMs.
ADB
wordt uitgevoerd op de computer en legt (meestal via USB) verbinding met
het Android-systeem. Laatstgenoemde moet die verbinding wel eerst toestaan. Als
eerste moeten de ontwikkelaarsopties worden ingeschakeld via Instellingen / Over
de telefoon / 7x tikken op Build-nummer. Hierna verschijnt er in Instellingen
een extra optie (bijna onderaan): Opties voor ontwikkelaars. Kies hier voor
Android-foutopsporing
en schakel deze functie in.
Input
In dit artikel zal ik slechts één mogelijke toepassing van deze duizendpoot op
de commandline toelichten: het commando adb shell input text
. Hiermee kun je
tekstvelden waar de Android-focus staat vanaf het toetsenbord van de computer
vullen. Ga daartoe als volgt te werk:
- Installeer
ADB
op de computer met bijvoorbeeld$ sudo apt install adb
. - Schakel de Android-foutopsporing in, zoals hierboven beschreven.
- Sluit de telefoon via USB aan op de computer.
- Open een dialoog waarin wordt gevraagd voor het WLAN-wachtwoord dat lang, complex en moeilijk te typen is. Plaats de cursor in het betreffende tekstveld.
- Vul het wachtwoord in met
$ adb shell input text 'WatHierStaatIsGeheim'
.
Te complex
Natuurlijk is niets zo eenvoudig als het in eerste instantie lijkt - ook dit
stappenplan is verre van perfect. Met name de lees- en bijzondere tekens in een
aantal wachtwoorden lieten zich niet zo 1-2-3 via bash
en adb
overpompen. Ik
moest op zoek naar de juiste aanhalingstekens om de tekens heelhuids aan de
overkant te krijgen.
Uiteindelijk bleek (ten minste bij gebruik van adb
) de volgende methode
doeltreffend: verpak de tekenreeks eerst in dubbele, daarna in enkele
aanhalingstekens.
adb shell input text '"WatHierSta@t1s&ehe!m"'
Toch was er nog één veldslag voordat ik mijn wachtwoord zonder problemen op het
Android-display zag verschijnen. Het dollarteken ($
) en de dubbele
aanhalingstekens ("
) werden nog steeds door bash
geïnterpreteerd. Een
backslash (\
) was voldoende om ook deze tekens ongehavend te kunnen invoeren.
adb shell input text '"Wat\"Hier\$ta@t1s&ehe!m"'
Update
Ook bovengenoemde methode bleek niet volledig effectief toen ik recent een wel
heel complex wachtwoord via deze methode wilde invoeren. Het bevatte niet alleen
een dollar-teken, maar ook een enkel aanhalingsteken, uitroepteken, hoedje,
rechte haak en een accolade. De uiteindelijke oplossing was, om het wachtwoord
als tekst in een bestand te zetten (ww.txt
), dat door printf
te laten
escapen en dat op zijn beurt aan adb
te voeren:
adb shell input text $( printf "%q" $( cat ww.txt ) )
Update (2)
Bovenstaand commando heeft nog één tekortkoming, zoals ik afgelopen tijd
ontdekte. Als het wachtwoord de combinatie %s
bevat, dan wordt dit door
adb
vertaald naar een spatie.
De enige manier om zo'n wachtwoord (of welke tekenreeks dan ook) via adb
in te voeren, is door de actie op te splitsen in twee of meer losse
aanroepen - aldus deze zeer informatieve pagina. Een voorbeeld:
$ cat ww.txt
tPaQ%s{brnHKX5Pt[b$Z
$ adb shell input text $( printf "%q" $( cat ww.txt ) )
# The '%s' is output as a space ' ' character
# tPaQ {brnHKX5Pt[b$Z
$ cat ww1.txt
tPaQ%
$ cat ww2.txt
s{brnHKX5Pt[b$Z
$ adb shell input text $( printf "%q" $( cat ww1.txt ) )
# The '%' is output as is, it has no special meaning
$ adb shell input text $( printf "%q" $( cat ww2.txt ) )
# The 's' is output as is, now it has no special meaning