Un servidor SSH a la tauleta Android

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 :

git01

La següent pantalla em mostra la branca master del repositori git de la tauleta :

Selecció_002

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.