¿Necesitas usar un mismo teclado y ratón entre dos ordenadores diferentes? Entonces estás leyendo en el lugar adecuado. Había tenido la misma necesidad, así que me dediqué a buscar y encontré una herramienta: netevent.
Para empezar, he de admitir que no es una herramienta tremendamente intuitiva de utilizar, y si es lo que estás buscando, creo que Synergy es una herramienta más completa y cuyo núcleo es de software libre, compatible con casi cualquier sistema operativo. Sin embargo, las compilaciones y el soporte es de pago. Creo que merece la pena echarle un ojo.
Volviendo con netevent, lo poco que he estado usando la herramienta me ha parecido tremendamente útil, aunque algo difícil de configurar. Aunque espero que este pequeño tutorial te ayude algo.
Lo primero, creo que es importante destacar que esta herramienta sólo sirve para métodos de entrada (teclado y ratón, pero no vídeo). Tampoco comparte el portapapeles, característica que sí que tiene Synergy.
Segundo: toda la configuración que necesitamos hacer se debe hacer en la máquina host, es decir, aquella que tiene los dispositivos USB conectados. Asimismo, todo el intercambio de datos se realiza por ssh, por lo que lo recomendable es que tengas configurado el acceso ssh sin contraseña desde el host hasta los clientes. Eso sí, ten claro que necesitamos instalarlo en todos los ordenadores, ya sean host o clientes.
Instalación
Si estamos en una distro de la familia Arch Linux, como Manjaro, con acceso al aur, el paquete netevent-git
.
yay -S neteven-git
Si por el contrario usamos Ubuntu o cualquier otra distro, lo que necesitaremos será descargar el código fuente, compilarlo y copiarlo al destino /usr/bin/netevent
.
git clone https://github.com/Blub/netevent.git cd netevent ./configure make # Finalmente, lo instalamos en el sistema sudo cp netevent /usr/bin/
Además, vamos a crear un directorio con permisos de lectura y escritura para nosotros en /etc/netevent
, donde pondremos nuestros ficheros de configuración. ¡Atentos!: estamos usando el usuario user
, por lo que lo deberéis sustituir allí donde sea necesario.
sudo mkdir /etc/netevent
sudo chown user:user /etc/netevent
Y ya por último, lo que crearemos va a ser un archivo de servicio para systemd. Abrimos un editor de texto cualquiera (sustituye nano
por vim
o emacs
, según prefieras)
sudo nano /etc/systemd/system/netevent@.service
Y copia las siguientes líneas. Atentos a la línea donde pone User=user
, sustituye lo que hay a la derecha del =
por tu nombre de usuario.
[Unit] Description=Launches netevent daemon with config file %i After=network.target [Service] User=user Type=simple ExecStart=/usr/bin/netevent daemon -s %i netevent-command.sock WorkingDirectory=/etc/netevent Restart=always [Install] WantedBy=multi-user.target
Vamos a necesitar también añadir nuestro usuario al grupo input
, para poder tener acceso a todos los dispositivos como usuario y no como root.
sudo gpasswd -a user input
Ahora sólo nos falta escribir nuestro fichero de configuración. Por comodidad, todo lo vamos a hacer en la carpeta /etc/netevent
que habíamos creado antes.
cd /etc/netevent
Configuración
El siguiente paso que necesitamos es crear un archivo de configuración. El propio repositorio ofrece dos ejemplos diferentes. Nosotros nos vamos a basar en el ejemplo básico.
Para configurar vamos a necesitar los siguientes elementos
- Id de dispositivo tanto del teclado como del ratón
- Una tecla hotkey, que cuando se pulse, redirigirá ambos periféricos hacia la otra máquina.
- Configurar SSH en la máquina que usará el teclado remotamente, con su correspondiente usuario e IP.
ID de dispositivo
Todos los dispositivos que podemos acceder estarán listados de una u otra forma en /dev/input
. En la carpeta by-id
nos será más fácil identificar al nuestro. Normalmente podremos identificar el teclado porque acaba con kbd
y al ratón porque acaba con mouse
. Podemos listarlos a todos con el siguiente comando:
ls -l /dev/input/by-id/
Una vez tengamos identificado a nuestro teclado o ratón podemos escribir el siguiente comando para ver si «responde» a la entrada, ya sea con una tecla o con mover el ratón. Debemos cambiar la parte que aparece después de /dev/...
por nuestros dispositivos que hemos encontrado con el comando de antes.
sleep 0.3 && netevent show /dev/input/by-id/usb-Complicated-Manufacturer-event-mouse
Si nos responden a los eventos físicos, es que vamos por buen camino. Si por el contrario nos sale el error: error: failed to query device name: Inappropriate ioctl for device
, entonces probamos otro, ya que puede ser que estén repetidos y algunos dispositivos no se usen.
Encontrando nuestra tecla hotkey
Lo siguiente que tendremos que hacer es encontrar la tecla hotkey que mejor se adapte a nuestra configuración. En mi caso decidí optar por el Ctrl derecho por similitud a VirtualBox. Con el comando de antes, cuando el dispositivo se trata de un teclado, entonces podremos ver la siguiente salida:
MSC:4:458980 KEY:97:1 SYN:0:0 MSC:4:458980 KEY:97:0 SYN:0:0 MSC:4:458980 KEY:97:1 SYN:0:0 MSC:4:458980
La línea que nos interesa pone delante KEY:
. En los tres casos vemos que la que acaba en :1
es que se pulsa y la que acaba en :0
es porque cesa la pulsación. De momento nos quedamos con esa tecla, que la necesitaremos cuando escribamos nuestro fichero de configuración.
Túnel SSH con el cliente
Por último vamos a necesitar una conexión SSH para contactar con el cliente. Este paso es probable que no necesites hacerlo si ya has accedido por ssh a la otra máquina.
Lo primero que deberás hacer es habilitar el servidor SSH en dicha máquina. En Ubuntu se consigue instalando el paquete ssh
y habilitando el servicio con systemd. En Arch/Manjaro, lo único necesario es habilitar el servicio. En esta entrada te cuento cómo hacerlo.
sudo apt install ssh
# Habilitamos el servicio con systemd
sudo systemctl enable sshd
sudo systemctl start sshd
Lo siguiente es crear una clave si no tenemos ninguna en la máquina host (la que tendrá el teclado)
ssh-keygen
Dejamos los parámetros por defecto y si nos pregunta por contraseña decimos que no.
Por último, enviamos el fichero a nuestro servidor SSH, la que recibirá la conexión cliente de teclado y ratón. Necesitarás cambiar el usuario y la IP por las que correspondan.
ssh-copy-id remoteuser@192.168.1.293
Creando el fichero de configuración
Si hemos seguido todos los pasos, deberíamos tener permisos de escritura con nuestro propio usuario en /etc/netevent. Creamos allí el siguiente fichero, con ell nombre que queramos. De nuevo, podemos sustituir nano
por nuestro editor favorito
sudo nano /etc/netevent/remote1
Y vamos cambiando a cada punto aquellos parámetros que hemos descubierto en los pasos anteriores
# Add mouse & keyboard device add my-mouse /dev/input/by-id/usb-MyCoolMouse-if01-event-mouse device add my-kbd /dev/input/by-id/usb-MyCoolKeyboard-event-kbd # Add toggle hotkey (on press, and ignore the release event) hotkey add my-kbd key:189:1 grab toggle hotkey add my-kbd key:189:0 nop # Add my usual output: output add laptop exec:ssh remoteuser@192.168.1.293 netevent create # Cause grabbing to write to that output use laptop
Y ya sólo nos faltará ponerlo en marcha. Para ello, usaremos el servicio de systemd que creamos anteriormente. Una apreciación: a la derecha del símbolo arroba es donde va el nombre del fichero de configuración.
sudo systemctl start netevent@remote1
Y ya si queremos que se inicie a la vez que el ordenador:
sudo systemctl enable netevent@remote1
¡Ya sólo nos queda probarlo en ambos ordenadores!
Resolución de problemas
Error opening uinput device: permission denied
Esto es porque en la máquina destino o bien el dispositivo uinput no está creado o el módulo uinput no está cargado en el módulo. Si es el caso: usar modprobe para cargar el módulo.
sudo modprobe -i uinput
Otra opción es que el usuario de la máquina destino no tenga permisos para escribir/usar uinput. Esto lo solucionamos con:
remoteuser@laptop$ sudo setfacl -m "u:remoteuser:rw-" /dev/uinput