GDPR Cookie Consent by FreePrivacyPolicy

Un terminal SSH en nuestro navegador web usando Wetty

Fecha: 2017-09-25 Tiempo de lectura: 3 minutos Categoría: Operaciones Tags: ssh / terminal / wetty

No siempre tenemos acceso a nuestro terminal SSH favorito para acceder a nuestros entornos en caso de emergencia. De hecho, en muchas redes suelen prohibir el tráfico por otros puertos ajenos a la navegación web. Para estos casos podemos tener un terminal SSH a través de una página web propia.

El truco consiste en usar Wetty. Si os interesa, podéis encontrar el repositorio de GitHub aquí.

Terminal over HTTP and HTTPS. Wetty is an alternative to ajaxterm/anyterm but much better than them because wetty uses ChromeOS’ terminal emulator (hterm) which is a full fledged implementation of terminal emulation written entirely in Javascript. Also it uses websockets instead of Ajax and hence better response time.

Podemos encontrar una imagen en DockerHub, que nos vale para una demostración rápida. Sin embargo, el gran tamaño de su imagen la hace impracticable para un uso habitual.

gerard@aldebaran:~/docker/wetty$ docker images | grep wetty
nathanleclaire/wetty   latest              94635175ccb6        2 years ago         1.2 GB
gerard@aldebaran:~/docker/wetty$ 

Así pues, podemos construir otra imagen, basándonos en los pasos de instalación que aparecían en GitHub, con el único añadido de un fichero .tar.gz con una imagen del repositorio.

gerard@aldebaran:~/docker/wetty$ tar tf wetty.tar.gz 
.gitignore
Dockerfile
Gruntfile.js
LICENSE
README.md
app.js
bin/
bin/wetty.conf
bin/wetty.js
bin/wetty.service
package.json
public/
public/index.html
public/wetty/
public/wetty/hterm_all.js
public/wetty/index.html
public/wetty/wetty.js
terminal.png
gerard@aldebaran:~/docker/wetty$ cat Dockerfile 
FROM alpine:3.5
RUN apk add --no-cache nodejs tini
ENV NODE_ENV=production
ADD wetty.tar.gz /srv/app/
WORKDIR /srv/app/
RUN apk add --no-cache python2 make g++ && \
    npm install && \
    apk del python2 make g++
RUN adduser guest -D && \
    echo "guest:guest" | chpasswd
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "app.js", "-p", "3000"]
gerard@aldebaran:~/docker/wetty$ 

Esto nos deja una imagen mucho más pequeña, pero nos limita a entrar por SSH en un terminal de Alpine Linux, que aunque magnífico, no es tan completo como el de otras distribuciones. Usad la distribución que más os convenga.

gerard@aldebaran:~/docker/wetty$ docker images | grep wetty
wetty                  latest              45635173077e        35 minutes ago      56.2 MB
gerard@aldebaran:~/docker/wetty$ 

Como pretendo utilizarla como un máquina de salto, este tamaño y limitación son más que adecuados. Sin embargo no estaba dispuesto a pagar 1,2 gb por un contenedor que no hace nada por sí mismo…

Solo nos queda ejecutar la imagen exponiendo el puerto 3000 del contenedor, para poder acceder remotamente desde el navegador, que en mi caso estaría en http://localhost:3000/.

gerard@aldebaran:~/docker/wetty$ docker run -ti --rm -p 3000:3000 wetty
http on port 3000

AVISO: Esta página está desprotegida, sin autenticación ni encriptación. Una buena opción está en dotarla de ambos usando un servidor web nginx como frontal. También es interesante modificar el usuario de entrada con par de claves, añadir un cliente de SSH para saltar, y lo que más nos interese.