dotool, teclado y ratón en cualquier sitio

Vistas: 1
dotool, teclado y ratón en cualquier sitio

Hace unas semanas estaba escribiendo el artículo sobre xdotool, y como ya te conté, me llevé una decepción al recordar que no funciona en Wayland. Y claro, con la que está cayendo, cada vez más distribuciones están migrando al nuevo servidor gráfico, así que empecé a buscar alternativas. Probé ydotool pero no me acabó de convencer ese daemon corriendo en segundo plano y lo de los scan codes que parecen sacados de una máquina de los 80. Lo peor de todo es que no encontraba una alternativa que hiciera lo mismo pero bien, hasta que di con dotool, una herramienta creada para el proyecto de control por voz Numen, y todo encajó. Y te aseguro que desde entonces no he vuelto a mirar atrás 🔥

¿Qué es dotool?

dotool es una herramienta de terminal creada por John Gebbie que simula entrada de teclado y ratón en Linux usando el módulo uinput del kernel. La gracia está en que funciona en cualquier sitio: X11, Wayland, e incluso en la propia consola (TTY). No depende del servidor gráfico, no necesita una extensión específica como XTEST, ni requiere un daemon en segundo plano como hace ydotool. Solo necesita Linux y los permisos adecuados para escribir en /dev/uinput.

El proyecto nació como parte de Numen, un sistema de control por voz para Linux que permite manejar el ordenador sin usar las manos. Numen está diseñado para ser completamente accesible: funciona en local, sin conexión a internet, sin enviar datos a servidores externos. Es software libre, por supuesto, y está pensado tanto para personas con problemas de movilidad como para cualquiera que quiera experimentar con el control por voz.

Numen necesitaba una forma fiable de simular entrada que funcionara independientemente del entorno gráfico, y de ahí salió dotool. Desde entonces, ha vivido su propia vida como herramienta independiente, y la verdad es que ha madurado muy bien 😊 No es una herramienta enorme ni tiene una legión de contribuidores, pero está bien escrita, hace lo que promete, y su código es limpio y fácil de mantener.

La sintaxis de dotool es limpia y directa: lees comandos desde la entrada estándar, los procesas, y se ejecutan. Nada de opciones crípticas ni banderas imposibles de recordar. Cada línea es una acción: type, key, mousemove, click, button… Todo con nombres descriptivos y argumentos claros. Y lo mejor de todo es que puedes encadenar comandos en un script de Bash o incluso desde una tubería con echo.

La última versión estable es la 1.6, publicada bajo licencia GPLv3, y se encuentra en su repositorio oficial de sourcehut. Si no conoces sourcehut, es una plataforma de desarrollo Git minimalista y respetuosa con la privacidad, mantenida por Drew DeVault, el mismo creador de Sway y Wayland. Vamos, que el ecosistema en el que se mueve dotool es el de la gente que sabe lo que hace.

Cómo funciona por debajo

Para entender por qué dotool es tan versátil, tienes que conocer el módulo uinput del kernel de Linux. Es un módulo que permite a los programas en espacio de usuario crear dispositivos de entrada virtuales. Cuando dotool arranca, crea un dispositivo /dev/uinput que el kernel trata exactamente igual que un teclado o ratón físicos.

Esto significa que la entrada simulada es indistinguible de la real para cualquier aplicación. No hay trucos, no hay capas de compatibilidad, no hay emulación. El kernel recibe los eventos desde uinput y los distribuye al sistema exactamente igual que si vinieran de un teclado USB. De hecho, si ejecutas evtest mientras dotool está enviando eventos, verás que aparecen exactamente con el mismo formato que los de un teclado real.

El flujo es sencillo:

tu script → dotool (stdin) → /dev/uinput → kernel → sistema

Como no depende de X11 ni de Wayland, funciona en cualquier entorno. Y como usa libxkbcommon para la distribución de teclado, los caracteres que envías se corresponden con tu diseño de teclado real. Si tienes el teclado en español, type "ñ" funciona como esperas. Esto es algo que ydotool no hace bien con su sistema de scan codes, y es una de las razones por las que dotool me parece superior.

Otra ventaja del diseño con uinput es que dotool no necesita un servidor gráfico en ejecución. Puedes usarlo desde una sesión SSH, desde un script que se ejecute en un TTY, o incluso desde un cron job. Las posibilidades son enormes. Imagina un script que cada mañana, a las 8, abra tu navegador con las páginas que necesitas para trabajar. Con dotool es perfectamente posible, y además funciona aunque no haya nadie sentado delante del ordenador.

La pila de protocolos

Para que te hagas una idea de cómo se compara con xdotool, aquí tienes la pila de cada uno:

Capaxdotooldotool
Aplicaciónxdotooldotool
BibliotecalibxdoNo necesita
ProtocoloXlib (XTEST)ioctl uinput
ServidorX11kernel Linux
HardwareVirtual (XTEST)Virtual (uinput)

La diferencia clave está en la capa de protocolo: xdotool habla con el servidor X11, mientras que dotool habla directamente con el kernel. Esto hace que dotool sea independiente del servidor gráfico, pero también significa que no puede hacer cosas como gestionar ventanas, porque esa información solo está disponible a través del servidor X11 o del compositor Wayland.

Instalación

Instalar dotool es sencillo, y está disponible en los repositorios de varias distribuciones. No necesitas compilar nada si usas una distribución que lo incluya.

Desde paquetes oficiales

Si usas Arch Linux o derivados, lo tienes en AUR:

yay -S dotool

O si prefieres hacerlo a mano:

git clone https://aur.archlinux.org/dotool.git cd dotool makepkg -si

En Alpine Linux es igual de sencillo:

apk add dotool

En NixOS:

nix-env -iA nixos.dotool

O si usas home-manager:

home.packages = [ pkgs.dotool ];

En Void Linux:

xbps-install -S dotool

Desde fuente

Si tu distribución no lo incluye, o prefieres compilarlo tu mismo, el proceso es igual de sencillo. Necesitas gcc (o equivalente), go, libxkbcommon-dev y scdoc para las páginas del manual.

git clone https://git.sr.ht/~geb/dotool cd dotool ./build.sh && sudo ./build.sh install

El script de compilación es transparente, puedes leerlo antes de ejecutarlo si te da desconfianza. Básicamente compila el binario de C, enlaza con libxkbcommon, y genera las páginas del manual con scdoc.

Después de instalar, tienes que recargar las reglas de udev para que tu usuario pueda escribir en /dev/uinput:

sudo udevadm control --reload && sudo udevadm trigger

Si no haces esto, tendrás que ejecutar dotool como root, y eso nunca es una buena idea. Las reglas de udev le dan permiso a tu usuario para escribir en el dispositivo uinput, que es lo que necesita dotool para funcionar.

Para comprobar que todo funciona correctamente:

echo "key a" | dotool

Si no ves errores, ya tienes dotool listo para funcionar. Prueba a abrir un editor de texto y ejecutar el comando de nuevo, deberías ver aparecer la letra ‘a’.

Uso práctico

Una de las cosas que más me gustan de dotool es su sintaxis. Cada línea es un comando independiente, y puedes encadenarlos con tuberías o desde un archivo. No hay opciones complicadas, no hay banderas que olvidar. Es tan simple como escribir lo que quieres que haga.

Escribir texto

echo "type Hola, mundo desde dotool" | dotool

Esto escribe “Hola, mundo desde dotool” donde sea que esté el foco del teclado. Sencillo y directo.

Las mayúsculas y caracteres especiales se manejan automáticamente según tu distribución de teclado. Si escribes type ñ y tienes el teclado en español, escribirás una eñe. No necesitas preocuparte por keycodes ni códigos numéricos. Esto es algo que agradeces cuando llevas un rato lidiando con ydotool y sus códigos hexadecimales.

Pulsar teclas especiales

echo "key Ctrl+c" | dotool echo "key Alt+Tab" | dotool echo "key Ctrl+Shift+Escape" | dotool

Las teclas se nombran de forma natural: Return, Escape, Tab, Ctrl, Alt, Shift, Super (la tecla Windows), Space, BackSpace, Delete, Home, End, PageUp, PageDown, las flechas (Up, Down, Left, Right), y todas las teclas de función (F1 a F24).

Puedes combinarlas con el signo +, igual que en la notación habitual de atajos de teclado. Y a diferencia de xdotool, no necesitas preocuparte por el orden de las teclas modificadoras ni por si el evento es key press o key release: dotool se encarga de todo.

Mover el ratón

echo "mousemove 500 300" | dotool

Mueve el cursor a las coordenadas 500, 300 de la pantalla. Las coordenadas son absolutas respecto a la pantalla principal. También puedes moverlo relativo a la posición actual:

echo "mousemove 10 20 relative" | dotool

Esto mueve el ratón 10 píxeles a la derecha y 20 hacia abajo desde donde esté. También puedes usar coordenadas polares:

echo "mousemove 50 180 polar" | dotool

Esto mueve el ratón 50 píxeles en la dirección de 180 grados (es decir, hacia la izquierda). El primer argumento es la distancia, el segundo el ángulo en grados.

Clics y botones

echo "click left" | dotool echo "click right" | dotool echo "click middle" | dotool

También puedes mantener pulsado y soltar, lo que te permite hacer arrastres:

printf "button left down\nsleep 0.5\nbutton left up\n" | dotool

Esto simula mantener el botón izquierdo pulsado durante medio segundo, útil para arrastrar elementos en el escritorio o en aplicaciones gráficas.

Desplazamiento

echo "scroll 0 10" | dotool

Desplaza 10 unidades hacia abajo. El primer argumento es el desplazamiento horizontal, el segundo el vertical. Valores negativos desplazan hacia arriba o hacia la izquierda. Esto es equivalente a girar la rueda del ratón.

Múltiples comandos en un script

{ echo "type firefox" echo "key Return" echo "sleep 2" echo "type atareao.es" echo "key Return" } | dotool

Usando un here document o un grupo de comandos, puedes encadenar todas las acciones que necesites. El comando sleep es parte del lenguaje de dotool, no necesitas usar sleep de Bash.

Casos de uso reales

Vamos a ver algunos ejemplos prácticos que puedes implementar en tu día a día. Estos son scripts que yo mismo uso, y que me han ahorrado más de un dolor de cabeza.

Script para abrir la web de atareao.es

#!/bin/bash { echo "key Super" echo "sleep 0.5" echo "type firefox" echo "key Return" echo "sleep 2" echo "type atareao.es" echo "key Return" } | dotool

Hazlo ejecutable con chmod +x abrir-atareao.sh y ejecútalo cuando quieras abrir el blog. Puedes asignarlo a un atajo de teclado en tu escritorio y listo. El sleep de 0.5 segundos entre pulsar Super y escribir el nombre de la aplicación es necesario para que el lanzador de aplicaciones tenga tiempo de abrirse.

Automatizar el inicio del trabajo

#!/bin/bash echo "Preparando el entorno de trabajo..." { echo "key Super" echo "sleep 0.5" echo "type terminal" echo "key Return" echo "sleep 1" echo "type cd ~/proyectos/mi-app" echo "key Return" echo "type code ." echo "key Return" echo "sleep 2" echo "key Super" echo "sleep 0.5" echo "type firefox" echo "key Return" echo "sleep 2" echo "type trello.com" echo "key Return" } | dotool

Este script lo tengo en mi ~/.local/bin/iniciar-jornada.sh y lo ejecuto cada mañana. Abre el terminal, navega a mi proyecto, abre VSCode, y luego abre Firefox con Trello. Todo con un solo comando. ¿Que no es la forma más elegante? Puede, pero funciona y me ahorra un montón de clics repetitivos.

Rellenar formularios

#!/bin/bash { echo "type Lorenzo" echo "key Tab" echo "type Carbonell" echo "key Tab" echo "type lorenzo@atareao.es" echo "key Tab" echo "type Esta es una prueba automatizada" echo "key Return" } | dotool

Perfecto para pruebas o para rellenar formularios repetitivos. Solo asegúrate de que el foco está en el primer campo antes de ejecutarlo. Esto lo uso mucho cuando tengo que dar de alta varios usuarios en un sistema web y no quiero estar copiando y pegando datos manualmente.

Control por voz con Numen

Este es el caso de uso original de dotool, y para el que está más optimizado. Numen es un sistema de control por voz que funciona completamente en local, sin conexión a internet, sin enviar datos a ningún lado. Usa dotool como backend de entrada, y te permite hacer cosas como:

"abre Firefox" "escribe atareao.es" "pulsa Enter" "baja" "haz clic"

La integración es tan estrecha que Numen puede pasar comandos directamente a dotool sin necesidad de scripts intermedios. Y como dotool funciona con uinput, la respuesta es prácticamente instantánea.

Esto es especialmente útil para personas con problemas de movilidad, o para situaciones en las que no puedes usar las manos. Y no hace falta tener una discapacidad para apreciarlo: cualquiera que haya tenido una tendinitis sabe de lo que hablo.

Arrastrar y soltar con precisión

#!/bin/bash { echo "mousemove 200 300" echo "button left down" echo "sleep 0.1" echo "mousemove 400 350" echo "button left up" } | dotool

El sleep de 0.1 segundos entre pulsar y mover es importante: algunos gestores de ventanas necesitan ese pequeño retardo para registrar correctamente el inicio del arrastre. Sin ese sleep, a veces el gestor interpreta que es un clic en lugar de un arrastre.

Escribir una receta médica automatizada

#!/bin/bash { echo "type Paracetamol 500 mg" echo "key Tab" echo "type 1 comprimido cada 8 horas" echo "key Tab" echo "type 7 días" echo "key Tab" echo "key Tab" echo "type Dr. Lorenzo Carbonell" echo "key Return" } | dotool

Vale, esto es un ejemplo un poco rebuscado, pero te haces a la idea. Cualquier tarea repetitiva que implique rellenar campos en un formulario web o aplicación de escritorio es candidata a automatizarse con dotool.

Atajos de teclado globales personalizados

#!/bin/bash # Minimizar todas las ventanas y mostrar el escritorio echo "key Super+d" | dotool

Claro, esto ya lo hace tu escritorio probablemente. Pero la gracia es que puedes combinarlo con condiciones, temporizadores, o ejecutarlo desde un cron job. Por ejemplo, un script que minimice todas las ventanas a las 14:00 para recordarte que es hora de comer:

0 14 * * * echo "key Super+d" | /usr/bin/dotool

O un script que cierre todas las ventanas cuando te vas a dormir:

0 23 * * * /usr/local/bin/limpiar-escritorio.sh

Scripting avanzado con dotool

Una vez que dominas los comandos básicos, puedes empezar a hacer cosas más interesantes combinando dotool con otras herramientas de Linux.

Usar dotool con entradas de un archivo

#!/bin/bash while IFS= read -r linea; do { echo "type $linea" echo "key Return" echo "sleep 0.5" } | dotool done < lista.txt

Esto lee un archivo línea por línea y escribe cada línea seguida de Enter. Perfecto para automatizar la carga de datos en un formulario o para enviar mensajes.

Integración con xdotool para gestión de ventanas

Si estás en X11, puedes combinar lo mejor de ambos mundos: usar xdotool para localizar y activar ventanas, y dotool para la entrada de teclado y ratón:

#!/bin/bash # Activar ventana del navegador con xdotool y escribir con dotool WID=$(xdotool search --name "Firefox" | head -1) xdotool windowactivate "$WID" sleep 0.5 echo "type atareao.es" | dotool echo "key Return" | dotool

Bucle con pausas

#!/bin/bash # Enviar un mensaje cada hora while true; do echo "type Recordatorio: haz una pausa" | dotool echo "key Return" | dotool sleep 3600 done

Ideal para recordatorios periódicos o para simular actividad en el ordenador.

Temporizador con Zenity

#!/bin/bash segundos=$(zenity --entry --title "Temporizador" --text "¿Cuántos segundos?") sleep "$segundos" echo "type ¡Tiempo cumplido!" | dotool echo "key Return" | dotool

Una forma sencilla de crear un temporizador con interfaz gráfica que, al terminar, escribe un mensaje donde sea que estés trabajando.

dotool vs xdotool vs ydotool

Voy a ser honesto sobre las diferencias entre las tres herramientas, porque cada una tiene su sitio y no todo es blanco o negro.

Característica dotool xdotool ydotool
Funciona en Wayland ✅ Sí ❌ No ✅ Sí
Funciona en TTY ✅ Sí ❌ No ✅ Sí
Soporte distribución teclado ✅ Sí (xkbcommon) ✅ Sí (X11) ❌ Scan codes
Necesita daemon ❌ No ❌ No ✅ Sí (ydotoold)
Sintaxis intuitiva ✅ Sí ⚠️ Regular ❌ Críptica
Gestión de ventanas ❌ No ✅ Sí ❌ No
Paquetes oficiales ✅ Varias (Alpine, Nix, Void, AUR) ✅ Todas ❌ Solo AUR
Licencia GPLv3 BSD AGPLv3
Mantenimiento ✅ Activo (2026) ✅ Activo (v4.20260303.1) ⚠️ Sin releases desde 2023
Página del manual ✅ Sí (scdoc) ✅ Sí ❌ No

dotool gana en versatilidad (funciona en cualquier entorno) y en limpieza de sintaxis. Es la opción más moderna y mejor pensada para entornos Wayland y mixtos.

xdotool sigue siendo imbatible si necesitas gestionar ventanas (mover, redimensionar, buscar, cambiar foco) y estás en X11. Su soporte de gestión de ventanas es insuperable, y además tiene características como la pila interna de IDs y el comando behave que no tienen equivalentes en las otras herramientas.

ydotool es una alternativa funcional, pero el sistema de scan codes y el daemon hacen que sea menos cómodo. Además, el proyecto parece un poco abandonado: el último release fue en 2023, mientras que dotool tiene versiones de 2026.

Mi recomendación: si estás en X11 y necesitas control de ventanas, usa xdotool. Si estás en Wayland, o necesitas que funcione en cualquier sitio, usa dotool. Y si por algún motivo no puedes usar dotool, ydotool es tu plan B.

Solución de problemas

Como con cualquier herramienta que interactúa con el hardware, pueden surgir problemas. Estos son los más comunes y cómo solucionarlos.

dotool no tiene permisos para /dev/uinput

Si ves un error como permission denied al ejecutar dotool, el problema son los permisos de uinput. Solución:

sudo udevadm control --reload && sudo udevadm trigger

Si sigue sin funcionar, comprueba que tu usuario está en el grupo input:

sudo usermod -aG input $USER

Y cierra sesión y vuelve a entrar para que los cambios surtan efecto.

Las teclas no se corresponden con mi distribución de teclado

dotool usa libxkbcommon para determinar la distribución de teclado. Si no detecta la correcta, puedes especificarla manualmente:

echo "key a" | dotool -layout es

Esto fuerza la distribución española. Las opciones de layout son las mismas que usa setxkbmap.

Los comandos no tienen efecto en algunas aplicaciones

Algunas aplicaciones, especialmente las que se ejecutan con privilegios elevados (como sudo), ignoran los eventos de uinput por razones de seguridad. También hay juegos y aplicaciones que usan métodos de entrada alternativos y pueden no reaccionar a eventos simulados.

Solución: ejecuta dotool con los mismos privilegios que la aplicación destino. Si la aplicación se ejecuta como tu usuario, dotool también debería hacerlo.

Conclusión

Llegados a este punto, creo que ha quedado claro por qué me ha gustado tanto dotool. No es la herramienta más conocida, ni la que tiene más estrellas (bueno, en sourcehut no hay estrellas, pero me entiendes), pero resuelve el problema de la simulación de entrada en Linux de una forma elegante y eficaz.

El hecho de que funcione en cualquier entorno gráfico, que no necesite un daemon, y que su sintaxis sea tan limpia, la convierten en una herramienta que deberías tener en tu caja de herramientas. Sobre todo ahora que Wayland está ganando terreno y cada vez más distribuciones lo usan por defecto.

Eso sí, si necesitas control de ventanas (mover ventanas, redimensionarlas, buscarlas por título), dotool no es tu herramienta. Para eso sigues necesitando xdotool o herramientas específicas de tu gestor de ventanas como wmctrl o las API de tu compositor Wayland. Pero para escribir texto, pulsar teclas, mover el ratón y hacer clic, dotool es lo mejor que he probado hasta ahora 🔥

¿Y tú? ¿Has probado dotool? ¿Sigues usando xdotool o has encontrado otra alternativa para Wayland? Cuéntame en los comentarios.


Más información,

Deja una respuesta