Conectar al escritorio de una máquina virtual en Proxmox VE sin la interfaz gráfica usando tickets
Habitualmente, la comunicación entre el servidor Proxmox VE y el equipo cliente donde se muestre el escritorio de una de sus máquinas virtuales, se producirá utilizando un mecanismo basado tokens. La idea consiste en generar un ticket que debe acompañar cada respuesta (salvo la primera, que genera el tocken a partir de un nombre de usuario, una contraseña y un ámbito).
En un artículo anterior (SPICE: Acceder al escritorio de una máquina virtual Proxmox sin la interfaz web) ya aprendimos a deshabilitar este mecanismo para facilitar el acceso desde el Visor remoto sin tener que preocuparnos de los tokens. Sin embargo, esta solución es válida únicamente en situaciones donde la seguridad no es importante y, por supuesto, siempre que el acceso sea local.
Por otro lado, en los últimos días, hemos aprendido a Crear nuevas cuentas de usuario en Proxmox VE y también a crear Conjuntos en Proxmox VE. Combinando ambas ideas, podremos crear nuevas cuentas de usuario que tengan privilegios limitados en el sistema.
Así, un usuario podría autenticarse en la interfaz del Administrador web de Proxmox VE y tener acceso únicamente a los recursos del Conjunto (o conjuntos) donde lo hayamos añadido. Esto incluye la posibilidad de abrir una consola con el escritorio remoto de la máquina (o máquinas) virtuales sobre las que tenga acceso. Como es lógico, en el ordenador local necesitaremos tener instalado el visor remoto (si necesitas ayuda con eso, puedes consultar el artículo SPICE: protocolo de escritorio remoto para máquinas virtuales de Proxmox VE (Parte 2)).
Si aplicaste los cambios, explicados en el artículo SPICE: Acceder al escritorio de una máquina virtual Proxmox sin la interfaz web, sobre el archivo de configuración de la máquina virtual, deberás revertirlos para poder abrir el escritorio remoto desde la interfaz web.
Para lograrlo, basta con acceder al Administrador web de Proxmox VE como administrador, abrir la terminal y desplazarnos al directorio donde se almacenan los archivos de configuración de nuestras máquinas virtuales:
cd /etc/pve/qemu-server
Y editar el archivo de la máquina sobre la que queremos trabajar:
nano 101.conf
Cuando tengas el contenido del archivo en pantalla, debes buscar la línea que añadiste al principio del archivo y añadir, como primer carácter, una almohadilla (#). Esto hará que su contenido sea tomado como un comentario y no se tenga en cuenta.
#args: -spice port=5000,disable-ticketing
El resultado final será parecido a este:
Una vez completada la tarea, sólo nos queda salir. Para lograrlo, pulsamos las teclas Ctrl + X y nos aseguramos de guardar los cambios
Conectar al escritorio remoto usando tickets sin interfaz gráfica
Una vez comprobado que podemos establecer conexión con el escritorio remoto de la máquina virtual, desde el Administrador web, usando el protocolo SPICE, llega el momento de resolver la promesa del enunciado del artículo: Establecer esa misma conexión, pero sin usar el Administrador web.
Si nuestro equipo cliente emplea GNU/Linux, podemos alcanzar nuestro objetivo usado un script como el que nos ofrecen en https://git.proxmox.com/?p=pve-manager.git;a=blob_plain;f=spice-example-sh;hb=HEAD.
No obstante, en SomeBooks.es lo hemos adaptado un poco para que, en lugar de escribir los datos de autenticación como argumentos del script, se soliciten en una ventana emergente. De este modo, pienso que se simplifica su uso.
Parta conseguirlo utilizamos un fork de Zenity llamado YAD (Yet Another Dialog). Ambos son programas que muestran cuadros de diálogo en la interfaz gráfica y devuelven, al script que los presenta, el texto que escriba el usuario.
Si utilizar Ubuntu, como YAD se encuentra en los repositorios, para instalarlo sólo tendrás que ejecutar lo siguiente:
sudo apt install yad
También puede que necesites instalar curl, un programa utilizado para la transferencia de datos a través de la red. Sin embargo, vuelve a ser tan sencillo como usar el siguiente comando:
sudo apt install curl
Por lo tanto, nuestra versión del script es esta:
#!/bin/bash # needs pve-manager >= 3.1-44 rm spiceproxy res=$(yad --width=400 --center --title="" --text="Virtual Desktop Infraestructure" \ --image=dialog-password \ --form \ --field="Usuario" \ --field="Contraseña":H \ --field="VMID") ret=$? if [ $ret -eq 0 ] then USERNAME=$(echo $res | cut -d'|' -f1) PASSWORD=$(echo $res | cut -d'|' -f2) VMID=$(echo $res | cut -d'|' -f3) USERNAME="$USERNAME@pve" NODE=vs PROXY=192.168.2.12 DATA=`curl -k -d "username=$USERNAME&password=$PASSWORD" https://$PROXY:8006/api2/json/access/ticket` TICKET=`echo $DATA|sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"// g'|grep -w ticket| awk -F "|" '{print $2}'` CSRF=`echo $DATA|sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"// g'|grep -w CSRFPreventionToken| awk -F "|" '{print $2}'` curl -k -b "PVEAuthCookie=$TICKET" -H "CSRFPreventionToken: $CSRF" https://$PROXY:8006/api2/spiceconfig/nodes/$NODE/qemu/$VMID/spiceproxy -d "proxy=$PROXY" > spiceproxy remote-viewer spiceproxy --full-screen fi
Al ejecutarlo, aparecerá una ventana donde deberemos escribir el nombre del usuario, su contraseña y el identificador de la máquina virtual que queremos ejecutar.
Si todo es correcto, un instante después tendremos delante el escritorio de la máquina virtual.
Y esto es todo por hoy. Espero que te haya resultado útil.