Tota tauleta Android té un Linux amagat al seu interior.
Per arribar fins aquest Linux hi han diverses opcions. La que he trobat més senzilla és mitjançant l’app Termux.
Termux
Termux és una app que es pot instal·lar des del Google Play.
Segons ens diu la seva pàgina:
“Termux combina una potent emulació de terminal amb una extensa col·lecció de packages de Linux :
• Gaudeix de les shells bash i zsh.
• Edita fitxers amb nano i vim (o emacs, però en aquest cas és imprescindible un teclat!)
• Accedeix a servidors remots mitjançant ssh (o, afegeixo, aixeca un servidor ssh i accedeix remotament a la teva tauleta/telèfon!)
• Desenvolupa en C/C++ amb les eines clang, make i gdb.
• Fes servir la consola Python com una calculadora de butxaca (o escriu scripts de propòsit general amb Python).
• Fes check out o clona projectes de repositoris remots amb git o amb subversion.
• Juga amb aventures conversacionals basades en text (us sona la saga Zork?) amb l’interpret frotz.”
Tot això -punt important- sense necessitat de rootejar la tauleta.
Instal·lar Termux no té cap secret. A més de Termux, convé instal·lar l’app Termux:API que complementa a Termux :
“Termux:API proporciona accés per la línia de comandes a les API’s del disposotiu :
* lectura i enviament de sms des del terminal.
* Accés al GPS des dels scripts.
* Aplicació del dispositiu text-to-speech als resultats de les comandes.
* Vibració del dispositiu.
* Accés al clipboard per als scripts.
* Accés a la llista de contactes per als scripts.”
Per un petit preu, també s’ofereixen altres apps que encara fan més útil Termux.
– Termux:Boot : permet executar scripts quan el dispositiu arrenca.
– Termux:Float : Permetr executar Termuxa una finestra flotant.
– Termux:Styling _ squemes de color i customització de l’aparença delterminal.
– Termux:Task : permet invocar executables de Termux des de Tasker i apps compatibles
– Termux:Widget : permet arrencar scripts de Termux des de la pantalla inicial de la tauleta
La Wiki de Termux és força completa i entenedora. Dins la Wiki de Termux també trobem una completa secció de FAQs.
El que m’ha interessat més ha estat la possibilitat de disposar d’un repositori git a la tauleta, i que aquest repositori fos accessible des d’un altre ordinador mitjançant protocol ssh. És dir, el problema principal que m’he proposat resoldre amb Termux ha estat : com posar en marxa el servidor ssh a la tauleta? idealment, amb el servidor ssh actiu a la tauleta, jo podria connectar-m’hi un client git des del portàtil, per exemple.
Instal·lació del programari
Primer de tot, cal instal·lar el programari necessari a la tauleta. La instal·lació de Termux des de Google Play no té cap dificultat. Un cop instal·lat, engego Termux…
Welcome to Termux! Wiki: https://wiki.termux.com Community forum: https://termux.com/community IRC channel: #termux on freenode Gitter chat: https://gitter.im/termux/termux Mailing list: termux+subscribe@groups.io Search packages: pkg search Install a package: pkg install Upgrade packages: pkg upgrade Learn more: pkg help bash-4.4$
Observo que només hi ha un sistema base i cal afegir tot el programari que emcalgui.
Executo les següents instruccions (un teclat extern USB o Bluetooth pot ser de molta ajuda!)
Afegir paquets és molt semblant al procediment que se segueix amb distribucions Linux com Debian.
Vull una shell bash, com al Linux del sobretaula:
bash-4.4$ pkg install bash Hit:1 http://termux.net stable InRelease Reading package lists... Done Building dependency tree Reading state information... Done 36 packages can be upgraded. Run 'apt list --upgradable' to see them. Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be upgraded: bash 1 upgraded, 0 newly installed, 0 to remove and 35 not upgraded. Need to get 360 kB of archives. After this operation, 0 B of additional disk space will be used. Get:1 http://termux.net stable/main arm bash arm 4.4.23-2 [360 kB] Fetched 360 kB in 0s (1291 kB/s) (Reading database ... 7367 files and directories currently installed.) Preparing to unpack .../archives/bash_4.4.23-2_arm.deb ... Unpacking bash (4.4.23-2) over (4.4.19) ... Setting up bash (4.4.23-2) ... bash-4.4$
Vull C/C++ i Python per a poder programar
– instal·lació de clang
bash-4.4$ pkg install clang Hit:1 http://termux.net stable InRelease Reading package lists... Done Building dependency tree Reading state information... Done 38 packages can be upgraded. Run 'apt list --upgradable' to see them. Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be upgraded: clang 1 upgraded, 0 newly installed, 0 to remove and 37 not upgraded. Need to get 11.1 MB of archives. After this operation, 13.4 MB of additional disk space will be used. Get:1 http://termux.net stable/main arm clang arm 6.0.1 [11.1 MB] Fetched 11.1 MB in 6s (1664 kB/s) (Reading database ... 7379 files and directories currently installed.) Preparing to unpack .../archives/clang_6.0.1_arm.deb ... Unpacking clang (6.0.1) over (5.0.1-1) ... Setting up clang (6.0.1) ... bash-4.4$
– instal·lació de python :
bash-4.4$ pkg install python Hit:1 http://termux.net stable InRelease Reading package lists... Done Building dependency tree Reading state information... Done 37 packages can be upgraded. Run 'apt list --upgradable' to see them. Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be upgraded: python 1 upgraded, 0 newly installed, 0 to remove and 36 not upgraded. Need to get 5564 kB of archives. After this operation, 393 kB disk space will be freed. Get:1 http://termux.net stable/main arm python arm 3.6.6 [5564 kB] Fetched 5564 kB in 3s (1849 kB/s) (Reading database ... 7397 files and directories currently installed.) Preparing to unpack .../archives/python_3.6.6_arm.deb ... Unpacking python (3.6.6) over (3.6.4-1) ... dpkg: warning: unable to delete old directory '/data/data/com.termux/files/usr/lib/python3.6/lib2to3/tests': Directory not empty Setting up python (3.6.6) ... Setting up pip... Looking in links: /data/data/com.termux/files/usr/tmp/tmp599bopw8 Collecting setuptools Collecting pip Installing collected packages: setuptools, pip Found existing installation: setuptools 28.8.0 Uninstalling setuptools-28.8.0: Successfully uninstalled setuptools-28.8.0 Found existing installation: pip 9.0.1 Uninstalling pip-9.0.1: Successfully uninstalled pip-9.0.1 Successfully installed pip-10.0.1 setuptools-39.0.1 bash-4.4$
Haureu notat que els missatges que estic mostrant no corresponen a una instal·lació inicial si no a un upgrade. És que, de fet, per a escriure aquest post estic tornant a passar l’instal·lador.
En resum : el procediment és el mateix que amb els gestor de paquets d’altres distribucions.
Vull el git per mantenir el meu codi ben versionat
– git
pkg install git
Vull un editor que em permeti fer de tot, i que a més sigui programable amb Lisp!
– emacs
pkg install emacs
Necessito relaxar-me i distreure’m amb jocs de ficció interactiva.
– frotz
pkg install frotz
Criptografia i ssh.
– openssl :
pkg install openssl
– openssh :
pkg install openssh
Altres paquets que poden ser interessants : el gpg, netcat, curl…
Si feu
pkg list-all
Obtindreu una llista dels paquets disponibles. En general, instal·lar un paquet és tan senzill com
pkg install nom_paquet
Configuració del servidor SSH
El client SSH ens queda instal·lat sense més que instal·lar el paquet openssh El que resta és configurar el servidor ssh per a fer accessible la tauleta des de l’exterior.
Em baso en el que hi ha a :
https://glow.li/technology/2015/11/06/run-an-ssh-server-on-your-android-with-termux/
i també a https://wiki.termux.com/wiki/Remote_Access
El primer que cal tenir en compte és que el Termux només es per a un usuari. Això vol dir que qualsevol accés des de l’exterior ha de fer-se amb l’usuari que termux ens ha proporcionat. Però com us adonareu, termux no ens dona el password d’aquest usuari. És dir: no podem fer un login amb usuari – password.
Necessàriament, doncs, hem de fer el login d’una altre forma. La solució és crear una parell clau privada – clau pública d’accés amb ssh-keygen.
Simplement, executo ssh-keygen amb les opcions per defecte.
En el meu cas, com que ja disposava d’un parell clau privada/clau pública i ja l’he distribuït, el que he fet és generar el parell de claus a una carpeta alternativa.
bash-4.4$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/data/data/com.termux/files/home/.ssh/id_rsa): /data/data/com.termux/files/home/alternative1_rsa Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /data/data/com.termux/files/home/alternative1_rsa. Your public key has been saved in /data/data/com.termux/files/home/alternative1_rsa.pub. The key fingerprint is: SHA256:xMACExf/9or00y35to2/vw/ft3HBWKZypXOoWFJpAFk u0_a89@localhost The key's randomart image is: +---[RSA 2048]----+ | +ooo..+E | | o...+ . . | | .. o + + | | o o X | | S. o B + | | . .+ + o .| | . o.+ ...| | . o..+ oo o=| | . o. ++o+=X| +----[SHA256]-----+ bash-4.4$
Ara puc observar que han aparegut els fitxers id_rsa i id_rsa.pub a la carpeta ~/.ssh. Respectivament la clau privada i la clau pública que he generat.
bash-4.4$ ls -al ~/.ssh total 32 drwx------ 2 u0_a89 u0_a89 4096 Sep 1 22:33 . drwx------ 7 u0_a89 u0_a89 4096 Sep 2 17:20 .. -rw------- 1 u0_a89 u0_a89 0 Sep 1 22:34 authorized_keys -rw------- 1 u0_a89 u0_a89 3381 Sep 1 21:15 id_rsa -rw------- 1 u0_a89 u0_a89 742 Sep 1 21:15 id_rsa.pub -rw-r--r-- 1 u0_a89 u0_a89 532 Sep 1 21:32 known_hosts bash-4.4$
Ara vaig a provar que el servidor ssh funciona. Per a fer-ho, primer de tot l’engego (amb termux en mode bàsic, no tinc una altre opció que engegar manualment)
sshd
Vull provar connectant-me amb ssh des del mateix termux, per a fer-ho cal que la clau pública que acabo de generar estigui a la llista de claus autoritzades
Per això, simplement la concateno a authorized_keys que es troba a ~/.ssh
bash-4.4$ cat id_rsa.pub >> authorized_keys bash-4.4$ chmod 600 authorized_keys bash-4.4$ ls -al total 36 drwx------ 2 u0_a89 u0_a89 4096 Sep 2 18:42 . drwx------ 7 u0_a89 u0_a89 4096 Sep 2 17:20 .. -rw------- 1 u0_a89 u0_a89 742 Sep 2 18:42 authorized_keys -rw------- 1 u0_a89 u0_a89 3381 Sep 1 21:15 id_rsa -rw------- 1 u0_a89 u0_a89 742 Sep 1 21:15 id_rsa.pub -rw-r--r-- 1 u0_a89 u0_a89 532 Sep 1 21:32 known_hosts bash-4.4$
Arribats a aquest punt, ja puc provar el meu servidor ssh
bash-4.4$ ssh ip_tauleta -p 8022 Welcome to Termux! Wiki: https://wiki.termux.com Community forum: https://termux.com/community IRC channel: #termux on freenode Gitter chat: https://gitter.im/termux/termux Mailing list: termux+subscribe@groups.io Search packages: pkg search Install a package: pkg install Upgrade packages: pkg upgrade Learn more: pkg help $
Accés des de l’exterior
A la vista de com ha funcionat aquest primer accés, ja puc veure quin és el procediment per accedir remotament al servidor ssh de la tauleta: cal que a les authorized_keys de la tauleta hi hagi la clau pública de l’usauri de l’ordinador remot amb el que penso accedir.
Això vol dir que si vull accedir a la tauleta des del meu sobretaula, el procediment és el següent:
1 – he de generar una parella clau privada-clau pública amb ssh-keygen al sobretaula
2 – aleshores, he de concatenar la clau pública generada a l’authorized_keys de la la tauleta.
3 – reinicio sshd.
Per engegar el servidor :
sshd
Per controlar-ne el funcionament :
logcat -s 'syslog:*'
Per aturar el servidor :
pkill sshd
He de copiar la clau pública del sobretaula a la tauleta. La solució més primitiva és fer servir un pendrive usb, passant físicament la clau des del sobretaula a la tauleta. Però, certament, aquest mètode no és gaire elegant.
Hi ha una opció millor : Des de la tauleta puc connectar-me amb scp o sftp al sobretaula (evidentment, sempre que el sobretaula també tingui un servidor ssh! en funcionament)
$ sftp albert@ip_sobretaula Connected to albert@ip_sobretaula. sftp> ls Baixades Escriptori ... sftp> cd .ssh sftp> ls authorized_keys authorized_keys~ id_rsa id_rsa.pub known_hosts sftp> get id_rsa.pub id_rsa_sobretaula.pub Fetching /home/albert/.ssh/id_rsa.pub to id_rsa_sobretaula.pub ... sftp> exit $ ls -al total 36 drwx------ 2 u0_a89 u0_a89 4096 Sep 2 22:25 . drwx------ 7 u0_a89 u0_a89 4096 Sep 2 22:23 .. -rw------- 1 u0_a89 u0_a89 742 Sep 1 22:06 authorized_keys -rw------- 1 u0_a89 u0_a89 3381 Sep 1 21:15 id_rsa -rw------- 1 u0_a89 u0_a89 742 Sep 1 21:15 id_rsa.pub -rw------- 1 u0_a89 u0_a89 740 Sep 2 22:25 id_rsa_sobretaula.pub -rw-r--r-- 1 u0_a89 u0_a89 532 Sep 1 21:32 known_hosts $
Cal indicar que des del sobretaula, també hi ha la possibilitat de fer servir ssh-copy-id per passar la clau pública tot just generada a un servidor remot. (consulteu https://www.ssh.com/ssh/copy-id).
ssh-copy-id
Es pot fer amb una instrucció com aquesta:
ssh-copy-id -i ~/.ssh/mykey user@host
Aquesta instrucció accedeix al host remot i afegeix la clau pública (*) de mykey al fitxer authorized_keys del host remot.
(*) La clau pública! La clau privada, com el seu nom indica, és privada i ningú més que el propietari l’ha de conèixer!
Si li cal, ssh-copy-id demanarà la forma d’autenticar-se amb el host remot. En el cas de Termux, això planteja el problema que no es coneix el password de l’usuari de Termux.
Arribats a aquest punt, ja tinc la clau pública del sobretaula a la tauleta i l’he concatenat a l’authorized_keys. Reinicio el servidor sshd i, des del sobretaula provo a accedir :
albert@artemis:~$ ssh 192.168.0.112 -p 8022 Welcome to Termux! Wiki: https://wiki.termux.com Community forum: https://termux.com/community IRC channel: #termux on freenode Gitter chat: https://gitter.im/termux/termux Mailing list: termux+subscribe@groups.io Search packages: pkg search Install a package: pkg install Upgrade packages: pkg upgrade Learn more: pkg help $
Ja puc accedir a la tauleta des del sobretaula.
Seguint el mateix procediment puc donar accés ssh a la tauleta des de qualsevol altre equip. El truc és generar el parell clau privada/clau pública a cada ordinador des del que em vulgui connectar i concatenar la clau pública obtinguda a l’authorized_keys de la tauleta.
Accés Git al repositori de la tauleta
Finalment, una aplicació pràctica. Inicialitzo un repositori git a la tauleta. En el meu cas he creat una carpeta workspace amb diferents subcarpetes per a desar-hi projectes en diferents llenguatges. He inicialitzat un repositori git a aquesta carpeta workspace.
$ ls albert alternative1_rsa alternative1_rsa.pub hosts prova.txt storage workspace $ cd workspace/ $ ls -al total 40 drwx------ 10 u0_a89 u0_a89 4096 Sep 1 20:53 . drwx------ 7 u0_a89 u0_a89 4096 Sep 2 22:30 .. drwx------ 7 u0_a89 u0_a89 4096 Sep 1 20:58 .git drwx------ 2 u0_a89 u0_a89 4096 Aug 19 12:48 as drwx------ 2 u0_a89 u0_a89 4096 Aug 19 12:49 awk drwx------ 2 u0_a89 u0_a89 4096 Dec 16 2017 bash drwx------ 2 u0_a89 u0_a89 4096 Feb 20 2018 c drwx------ 2 u0_a89 u0_a89 4096 Feb 20 2018 cc drwx------ 2 u0_a89 u0_a89 4096 Dec 16 2017 elisp drwx------ 4 u0_a89 u0_a89 4096 Aug 19 12:49 python $
Ara me’n vaig al sobretaula, i obro, per exemple, l’Eclipse que té el client EGit.
Simplement he de configurar ela URI del repositori al que vull accedir. He de parar atenció a:
1 – Indicar protocol ssh.
2 – Indicar la ip de la tauleta i, molt important, el port 8022.
3 – He indicat el path complet fins el repositori
3 – No cal que indiqui usuari i password.
La imatge ho aclareix :
La següent pantalla em mostra la branca master del repositori git de la tauleta :
A partir d’aquest punt ja podria fer el checkout dels projectes.
Molt important : per a que tot això funcioni cal que les IP dels diferents dispositius involucrats siguin fixes. Això vol dir que
1 – Al router de la vostra xarxa local cal donar IP fixes (dins del rang intranet, òbviament, és dir 192.168.x.x) als diferents ordinadors , impresores, smartphones o tauletes que pugueu tenir connectats
2 – Cal indicar a les tauletes que facin servir sempre la mateixa IP que li heu fet correspondre al router per connectar-se a la vostra xarxa local.