Aplicación Java que lee un comando enviado por Telegram y lo ejecuta en el sistema operativo con IntelliJ IDEA y repositorio Maven

Explicamos cómo desarrollar una aplicación Java usando el IDE IntelliJ IDEA que lee comandos enviados a Bot de Telegram y los ejecuta en el sistema operativo. Si el comando del sistema opertivo devuelve algún resultado el programa lo envía al chat de Telegram. Probamos la aplicación Java generando el JAR en real en equipos Windows, Linux y MAC OS y mostramos cómo ejecutar comandos y scripts de los sistema operativos desde el móvil y desde cualquier parte con Telegram.

Requisitos para aplicación Java que recibe comando enviado por Telegram y lo ejecuta en el sistema operativo

Necesitaremos disponer de un IDE de desarrollo, en nuestro caso usaremos IntelliJ IDEA (puede servir cualquier otro como Eclipse o Netbeans). Este requisito no es obligatorio dado que el código fuente de una aplicación Java puede hacerse hasta con el bloc de notas y luego compilarse con javac. Pero el uso de un IDE y casi todos son gratuitos, facilitará y ayudará mucho en los procesos de depuración y compilación de la aplicación.

Usaremos el repositorio Maven para descargar los ficheros JAR de dependencias del paquete que usaremos para el envío y la lectura de mensajes de Telegram. Explicaremos paso a paso cómo usar Maven en IntelliJ IDEA.

Para este proceso necesitaremos un Bot de Telegram, que será el que nos proporcione el token de acceso a Telegram. En el siguiente enlace explicamos paso a paso cómo crear un Bot en Telegram y cómo obtener su token de seguridad (que necesitaremos para la conexión, como explicaremos más adelante):

Una vez creado el Bot en Telegram anotaremos el nombre del Bot y el token, la cadena de caracteres unívoca que identificará el Bot y que no debemos compartir públicamente.

Como es lógico, para las pruebas necesitaremos tener instalado Telegram o bien en el móvil o bien usando alguna de sus aplicaciones de escritorio o el propio Telegram Web.

En la aplicación que desarrollaremos a continuación estamos suponiendo en todo momento que se ha habilitado la opción de lectura de mensajes del Bot de Telegram (/setprivacy a valor «DISABLED»), de forma que el Bot leerá todos los mensajes que se le escriban, sin necesidad de añadir «/» delante. Si no tenemos esta opción activa tendríamos que hacer una pequeña modificación en el código para quitar la «/» en el comando a ejecutar. Este caso ocurre cuando el Bot está agregado a un grupo, cosa que no recomendamos como explicamos aquí.

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee comando de Telegram y lo ejecuta en sistema operativo

A continuación crearemos un nuevo proyecto Java – Maven en IntelliJ IDEA, para ello, como siempre, desde «File» – «New» – «Project». Elegiremos «Maven» y la versión del SDK para la compilación y generación de los .class y el JAR:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee comando de Telegram y lo ejecuta en sistema operativo

Introduciremos los datos del proyecto, en Name el nombre identificativo, por ejemplo TelegramBotComandoSistemaOperativo y la ubicación:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee comando de Telegram y lo ejecuta en sistema operativo

Añadiremos la dependencia en el fichero pom.xml. Para ello lo abriremos haciendo doble clic sobre él [1], agregaremos el siguiente código XML al fichero pom.xml [2], antes de la etiqueta </project> y, una vez añadido, pulsaremos en el botón de «Load Maven changes» [3] para cargar el repositorio en local:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee comando de Telegram y lo ejecuta en sistema operativo

Crearemos una nueva clase, que será la clase principal del programa Java, la clase Main. Para ello pulsaremos con el botón derecho del ratón sobre la carpeta «Java» y en el menú emergente elegiremos «New» – «Java Class»:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee comando de Telegram y lo ejecuta en sistema operativo

Introduciremos el nombre para la clase, por ejemplo «Main» y pulsaremos

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee comando de Telegram y lo ejecuta en sistema operativo

El código fuente completo Java de la clase Main será el siguiente (incluye comentadas las líneas más importantes):

Antes de compilar y probar el código anterior, conviene cambiar el language level a 6, para evitar errores de compilación con los Overrides. Para ello accederemos al menú «File» – «Project Structure»:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee y envía mensajes a Telegram

Pulsaremos en Modules en la parte izquierda y en la derecha, en el desplegable de Language level, elegiremos «6 – @Override in interfaces»:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee y envía mensajes a Telegram

El código Java anterior iniciará la aplicación, solicitará el nombre de usuario del bot de Telegram y el token de seguridad. También se le puede pasar como parámetro. Una vez iniciada permanecerá a la escucha. En cuanto se envíe un mensaje al Bot de Telegram, o bien por privado al propio Bot o bien en un grupo donde esté agregado el Bot, el programa Java lo recibirá y ejecutará dicho mensaje como comando del sistema operativo. A continuación mostraremos su funcionamiento real para entender lo que hace.

Realizamos la compilación del programa Java y hacemos las primeras pruebas para ver su funcionamiento. Para ello pulsaremos en el menú «Run» y en «Run…»:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee y envía mensajes a Telegram

Al ser la primera vez que ejecutamos la aplicación, deberemos editar la compilación para establecer los parámetros de inicio (clase Main, versión JRE, ..). Para ello pulsaremos en «Edi Configurations…»:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee y envía mensajes a Telegram

Pulsaremos en + para añadir una nueva configuración, elegiremos «Application»:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee y envía mensajes a Telegram

Elegiremos la clase principal en Main class, en nuestro caso Main y pulsaremos «Apply» y Run si queremos ejecutar la aplicación:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee y envía mensajes a Telegram

La aplicación se ejecutará, nos pedirá el nombre de usuario del Bot de Telegram, lo introduciremos y pulsaremos INTRO. A continuación nos pedirá el token de seguridad del Bot de Telegram, lo introduciremos y pulsaremos INTRO. Si todo es correcto se iniciará y permanecerá a la espera de recibir mensajes:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee y envía mensajes a Telegram

Hay que tener en cuenta el sistema operativo donde se esté ejecutando la aplicación Java, en este caso en Windows 10, porque admitirá los comandos del sistema operativo en el que se ejecute.

Para probar la aplicación, abriremos Telegram y escribiremos un mensaje (comando de Windows), por ejemplo el siguiente mensaje/comando:

ping proyectoa.com

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee y envía mensajes a Telegram

Comprobaremos en la aplicación que ha recibido el comando y lo ha ejecutado:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee comando de Telegram y lo ejecuta en sistema operativo

Y en el chat de Telegram habremos recibido la respuesta del comando ejecutado:

Crear proyecto Java en IntelliJ IDEA usando Maven como repositorio que lee comando de Telegram y lo ejecuta en sistema operativo

Generar fichero JAR de aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo en IntelliJ IDEA y Maven

Una vez que hayamos comprobado que la aplicación funciona correctamente, generaremos el fichero «ejecutable» JAR para poder usar la aplicación en cualquier sistema operativo (Windows, Linux, MAC OS, …).

Una vez que hemos depurado la aplicación y comprobado que funciona correctamente desde el IDE IntelliJ IDEA, es momento de crear el archivo JAR ejecutable para poder probar el programa en equipos Windows y Linux. Para ello abriremos el menú «File» – «Project Structure…». En la parte izquierda pulsaremos en «Artifacts» y en la derecha en el botón + (Add):

Generar fichero JAR de aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo en IntelliJ IDEA y Maven

Pulsaremos en «JAR» y en «From modules with dependencies…»:

Generar fichero JAR de aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo en IntelliJ IDEA y Maven

Elegiremos la Main Class, en nuestro caso «Main», dejaremos marcada la opción «extract to the target JAR» y el directorio por defecto para el fichero MANIFEST.MF:

Generar fichero JAR de aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo en IntelliJ IDEA y Maven

Pulsaremos en «TelegramBotComandoSistemaOperativo.jar» y comprobaremos que aparece la clase Main en Main Class y la ruta del fichero de manifiesto correctos. Pulsaremos en OK:

Generar fichero JAR de aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo en IntelliJ IDEA y Maven

Para generar el JAR pulsaremos en el menú «Build» – «Build Artifacts» y elegiremos «TelegramBotComandoSistemaOperativo.jar» – «Build»:

Generar fichero JAR de aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo en IntelliJ IDEA y Maven

Nos mostrará el resultado de la compilación y generación del JAR:

Executing pre-compile tasks…
Loading Ant Configuration…
Running Ant Tasks…
Running ‘before’ tasks
Checking sources
Copying resources… [TelegramBotComandoSistemaOperativo]
Building artifact ‘TelegramBotComandoSistemaOperativo:jar’…
Deleting outdated files…
Building artifact ‘TelegramBotComandoSistemaOperativo:jar’: copying files…
Building archives…
Building …/alonso/IdeaProjects/TelegramBotComandoSistemaOperativo/out/artifacts/TelegramBotComandoSistemaOperativo_jar/TelegramBotComandoSistemaOperativo.jar…
Copying archives…
Running ‘after’ tasks
Finished, saving caches…
Executing post-compile tasks…
Loading Ant Configuration…
Running Ant Tasks…
Synchronizing output directories…

Y tendremos disponible el fichero JAR «ejecutable» de nuestra aplicación, válido para cualquier sistema operativo (Windos, Linux, …):

Generar fichero JAR de aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo en IntelliJ IDEA y Maven

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

Vamos a realizar unas pruebas reales de la aplicación Java en Windows. Para ello copiaremos el fichero generado anteriormente TelegramBotComandoSistemaOperativo.jar al equipo Windows que queramos usar. Funciona en casi cualquier versión (desde Windows XP hasta Windows 10 y Windows Server 2019). Probaremos la aplicación en un equipo con Windows Server 2019, para ello, abriremos una ventana de consola MS-DOS (línea de comandos o cmd). Puesto que ejecutaremos comandos, si queremos tener todos los permisos, abriremos la ventana de Símbolo del sistema con un usuario administrador, para ello pulsaremos en el botón Inicio de Windows y buscaremos «Símbolo del sistema» [1], pulsaremos con el botón derecho del ratón sobre él y elegiremos «Más» [2] – «Ejecutar como administrador» [3]:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

Como siempre para ejecutar aplicaciones Java, comprobaremos la versión de Java disponible en el equipo, en la línea de comandos escribiremos:

java -version

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

Deberemos tener una versión igual o superior a la usada para compilar el JAR, de lo contrario dará error. En el siguiente artículo explicamos cómo instalar la versión de Java en Windows:

En cuanto tengamos la versión de Java correcta, accederemos a la carpeta donde hayamos copiado el fichero ejecutable TelegramBotComandoSistemaOperativo.jar con el comando cd nombre_carpeta:

cd C:\ProyectoATelegramComandos

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

Y ejecutaremos el JAR con el comando Java:

java -cp TelegramBotComandoSistemaOperativo.jar Main «Nombre_Usuario_Bot_Telegram» «Token_Seguridad_Bot_Telegram»

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

La aplicación quedará a la escucha de mensajes. Ahora abriremos Telegram y accederemos al Bot de Telegram que estamos usando para escribirle un comando. Hay que tener en cuenta que el comando que le enviemos se ejecutará en real en el sistema operativo, por lo tanto hay que proceder con precaución. Enviaremos un comando sencillo, por ejemplo un «hostname», que nos devuelva el nombre del equipo:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

En cuanto enviemos el mensaje (comando) al Bot de Telegram, nuestro programa Java lo leerá y ejecutará el comando, literalmente, en el sistema operativo:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

Si el comando ejecutado devuelve algún resultado, el programa Java lo enviará al chat de Telegram:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

Vemos que devuelve el nombre DNS (hostname) del equipo donde se está ejecutando la aplicación Java. Por lo tanto este programa es muy útil para ejecutar comandos en equipo en remoto y desde cualquier parte del mundo, con el móvil y conexión a Internet.

La aplicación admite cualquier comando, aunque como es lógico no funcionará para comandos que requiera de interacción, por ejemplo aquellos que pidan confirmación o aquellos que necesiten de edición (como nano, vi, …).

Y, repetimos, hay que proceder con precaución porque la aplicación ejecutará el comando que se le envíe en real y con los permisos con los que se haya abierto la ventana de MS-DOS.

En el caso de Windows admite, también, comandos PowerShell, por ejemplo, el siguiente comando obtendrá el estado del servicio Spooler (Cola de impresión):

powershell -command «Get-Service -Name Spooler | ft -HideTableHeaders»

Lo escribimos en el Bot de Telegram:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

Y nos devolverá el estado en que se encuentre el servicio en el equipo donde se está ejecutando la aplicación Java:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

Combiene siempre intentar filtrar y limitar los resultados para que la respuesta del comando no devuelva mucha cantidad de texto, de lo contrario el resultado llegará acortado a Telegram. Por ejemplo, si queremos mostrar el estado de todos los servicios del sistema mediante PowerShell, ejecutando este comando en el Bot de Telegram:

powershell -command «Get-Service | Select-Object Name, Status»

Obtendremos este mensaje de resultado en el Bot tras ser ejecutado el comando en el sistema operativo:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

Indicando que el resultado ocupa 18438 caracteres y el máximo permitido por mensaje en Telegram es de 4094. En el caso anterior deberemos realizar algún filtro o formato para obtener el resultado más pequeño, por ejemplo filtrar solo los servicios iniciados o los detenidos.

Algunos comandos Windows, como el «dir», requerirán que se le añada cmd /c delante para su ejecución, por ejemplo:

cmd /c dir C:\ProyectoATelegramComandos

Enviará a Telegram el listado de las carpetas y ficheros que contiene la carpeta ProyectoATelegramComandos de nuestra unidad C:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Windows

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Linux

Para el caso de sistemas operativos Linux (admite cualquier distribución), el procedimiento será el mismo, teniendo en cuenta, lógicamente, que los comandos que enviaremos por Telegram serán propios de Linux.

Realizaremos la misma operación que en Windows, comprobar qué versión de Java tenemos instalada. En caso de no tener Java habrá que instalarlo, como indicamos en el siguiente enlace:

Accederemos a la carpeta donde tengamos el fichero JAR y lo ejecutaremos, introduciendo el nombre del usuario del Bot de Telegram y el token. La aplicación se iniciará y quedará a la escucha de mensajes. Cuando reciba un mensaje lo ejecutará en el sistema operativo Linux directamente y devolverá el resultado al chat de Telegram:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Linux

Realizaremos un ejemplo en Linux, enviaremos el siguiente comando Linux en el Chat del Bot de Telegram:

ipconfig

Devolverá la configuración de red del equipo Linux a Telegram:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Linux

Incluso podemos ejecutar script de Linux que hayamos creado previamente. Por ejemplo si queremos acceder a una base de datos MySQL, ejecutar una consulta y obtener el número de registros, en la carpeta donde tengamos el JAR de la aplicación Java crearemos el siguiente script de Linux:

Guardaremos el contenido anterior en un fichero, por ejemplo con el nombre «num_usuarios.sh»:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Linux

y le asignaremos el permiso de ejecución con el comando:

chmod +x num_usuarios.sh

Lo probaremos en la consola de Linux para ver que funciona correctamente:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Linux

El script de ejemplo anterior conecta con el servidor de base de datos MySQL localhost (puede conectarse a un servidor externo), abre la base de datos indicada y ejecuta en esta base de datos la consulta SQL que se ha introducido entre comillas, en nuestro caso obtiene el número de registros de la tabla nuke_users.

Ahora, para comprobar la eficacia de nuestra aplicación Java, en el bot de Telegram, ejecutaremos el script anterior creado en el equipo donde está en ejecución la aplicación. Enviaremos el siguiente mensaje en el chat de Telegram del Bot:

sh /tmp/num_usuarios.sh

El programa Java leerá el comando en el equipo Linux y lo ejecutará, devolviendo el resultado de la consulta SQL del script:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo Linux

Como vemos, es un ejemplo en Java con uso de los Bot de Telegram para hacer una utilidad real que puede servir de ayuda a administradores de sistemas. Podrán ejecutar comandos en sus equipos (sean Windows, Linux, MAC OS, …) desde cualquier parte del mundo, solo necesitarán conexión a Internet y Telegram en cualquier dispositivo (tablet, móvil, portátil, PC, …).

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo MAC OS

De la misma forma que hemos hecho para Windows y Linux, para equipos con sistema operativo MAC OS, abriendo una ventana de Termial y ejecutando el mismo comando que para Windows y Linux, la aplicación se ejecutará y permanerá a la escucha. La ventaja de los JAR de Java es que, normalmente, el mismo JAR sirve para cualquier sistema operativo, únicamente necesitamos la máquina virtual Java:

Probar aplicación Java que lee comando de Telegram y lo ejecuta en sistema operativo MAC OS

Algunos consejos de seguridad para el programa Java que ejecuta comandos del sistema operativo enviados desde Telegram

Por supuesto, una vez que se ha comprobado la capacidad real de la aplicación, hay que tener en cuenta que dicha aplicación ejecutará cualquier comando que se le envíe, tanto si devuelve resultados como si no y tanto si requiere de interactividad como si no. Ejecutará estos comandos con los privilegios del usuario con el que se haya ejecutado el JAR de Java. Si el usuario es administrador y se envía un comando, por ejemplo, de eliminación de archivos, el programa lo ejecutará.

Por lo anterior recomendamos desactivar la opción de que el Bot pueda agregarse a grupos. Al menos así no habrá varios usuarios que puedan usarlo a la vez en un grupo de Telegram, con la opción /setjoingroups. Explicamos cómo hacer esto en este artículo:

Una prueba real de que los comandos «peligrosos» también pueden ejecutarse. Por ejemplo, creamos un fichero en una carpeta del equipo Linux:

Algunos consejos de seguridad para el programa Java que ejecuta comandos del sistema operativo enviados desde Telegram

Ahora ejecutaremos el siguiente comando en el Bot de Telegram para eliminar el fichero «fichero.txt» de la carpeta «prueba_eliminacion» sin solicitar consentimiento:

rm -f /prueba_eliminacion/fichero.txt

Algunos consejos de seguridad para el programa Java que ejecuta comandos del sistema operativo enviados desde Telegram

En Telegram nos enviará un mensaje indicando que se ha ejecutado el comando y no ha devuelto resultados, pero se habrá ejecutado realmente y habrá eliminado el fichero. Y podremos comprobarlo en la carpeta de Linux ejecutando un ls -lah, ya no aparecerá:

Algunos consejos de seguridad para el programa Java que ejecuta comandos del sistema operativo enviados desde Telegram

Por lo tanto, como mecanismo de seguridad, recondamos que se compruebe de qué ID de chat viene el comando y solo se permita la ejecución de comandos de uno o varios chats. Podríamos solicitar este ID de chat por consola, igual que solicitamos el usuario y el token, o por parámetro o incluso leerlo de un fichero en el equipo, de forma que podamos establecer desde qué chats permitiremos la ejecución de comandos, haciendo una pequeña modificación en el código:

En la modificación anterior, solo permitirmos el envío de comandos y su ejecución para el chat con ID 111222333. Por lo tanto, si se escribe al Bot desde cualquier otro chat mostrará este mensaje indicando que no tiene permisos para ejecutar comandos:

Algunos consejos de seguridad para el programa Java que ejecuta comandos del sistema operativo enviados desde Telegram

Es muy recomendable aplicar el mecanismo de seguridad anterior porque el Bot, una vez creado en Telegram, puede ser accesible públicamente. Por lo tanto así nos aseguraremos de que nadie más puede ejecutarlo. Otra opción es permitir únicamente determinados usuarios, por su ID de usuario en Telegram.

Descarga del código fuente Java completo del proyecto en IntelliJ IDEA

Por supuesto, os pasamos el enlace para la descarga del código fuente completo de la aplicación Java que hemos comentado en este artículo. Incluye el fichero pom.xml con las dependencias de Maven, así como el ejecutable JAR ya generado:

alonsojpd

alonsojpd

Presidente y fundador de Proyecto A y AjpdSoft

También te podría gustar...

Deja una respuesta