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 operativo 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.
- 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.
- 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.
- 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.
- Descarga del código fuente Java completo del proyecto en IntelliJ IDEA.
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:

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

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:
1 2 3 4 5 6 7 |
<dependencies> <dependency> <groupId>org.telegram</groupId> <artifactId>telegrambots</artifactId> <version>4.9.2</version> </dependency> </dependencies> |

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»:

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

El código fuente completo Java de la clase Main será el siguiente (incluye comentadas las líneas más importantes):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
import org.telegram.telegrambots.ApiContextInitializer; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import org.telegram.telegrambots.meta.TelegramBotsApi; import org.telegram.telegrambots.meta.api.methods.send.SendMessage; import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.meta.exceptions.TelegramApiException; import java.io.*; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; //Extendemos la clase Main a la clase TelegramLongPollingBot public class Main extends TelegramLongPollingBot { private static String token = ""; private static String usuarioBot =""; //Pasamos como atributo a TelegramLongPollingBot el nombre del Bot @Override public String getBotUsername() { return this.usuarioBot; } //Pasamos como atributo a TelegramLongPollingBot el token de seguridad //Que hemos obtenido al crear el Bot en Telegram @Override public String getBotToken() { return this.token; } //Usamos el método onUpdateReceived de TelegramLongPollingBot //para recibir y enviar mensajes @Override public void onUpdateReceived(Update actualizacionEstado) { String comandoLeido; String resultadoComando; boolean superaCaracteres = false; // Comprobamos si hay mensaje y si el mensaje es de texto if (actualizacionEstado.hasMessage() && actualizacionEstado.getMessage().hasText()) { comandoLeido = actualizacionEstado.getMessage().getText(); //Ejecutamos el comando que se ha enviado por Telegram en el sistema operativo //y obtenemos el resultado del comando para enviarlo al chat origen de Telegram resultadoComando = EjecutarComando(comandoLeido); int longitudResultadoOriginal; longitudResultadoOriginal = resultadoComando.length(); //System.out.println (FechaActual() + "Resultado comando: " + resultadoComando); //El resultado no debe exceder los 4092 caracteres que //es el máximo permitido para un mensaje de Telegram System.out.println (FechaActual() + " Número caracteres de resultado original a enviar a Telegram: " + longitudResultadoOriginal); //Si supera los 4092 caracteres lo acortamos para que no dé error //el envío de mensaje a Telegram if (longitudResultadoOriginal > 4090) { superaCaracteres = true; resultadoComando = resultadoComando.substring(0, 4090); System.out.println (FechaActual() + " Número caracteres de mensaje acortado a enviar a Telegram: " + resultadoComando.length()); } if (resultadoComando.isEmpty()) { resultadoComando = "El comando [" + comandoLeido + "] no ha devuelto resultado"; } //Creamos objeto SendMessage SendMessage mensaje = new SendMessage( actualizacionEstado.getMessage().getChatId(), "Resultado del comando: [" + comandoLeido + "]" + System.lineSeparator() + resultadoComando); try { execute(mensaje); //Enviamos el mensaje al chat de Telegram System.out.println (FechaActual() + " Mensaje enviado con resultado de " + "comando a chat de Telegram [" + mensaje.getChatId() + "]"); //Si el resultado del comando supera los 4095 caracteres //se enviará un segundo mensaje avisando de que se ha acortado if (superaCaracteres) { //Enviamos un segundo mensaje indicando que el resultado supera //el máximo de caracteres de Telegram y ha sido acortado SendMessage mensajeAvisoAcortado = new SendMessage( actualizacionEstado.getMessage().getChatId(), "El resultado ha sido acortado, el original ocupaba " + longitudResultadoOriginal + " caracteres. Por lo tanto supera el máximo" + " permitido por mensaje de Telegram, que es de 4092 caracteres. Se" + " recomienda usar formatos y filtros de salida " + "de los comandos para que no lo superen"); execute(mensajeAvisoAcortado); } } catch (TelegramApiException e) { System.out.println (FechaActual() + " Error " + e.getMessage()); } } } //Método constructor de la clase principal Main public static void main(String[] args) { //Si se pasa el nombre del usuario del Bot y el token por parámetro lo leemos if (args.length == 2) { usuarioBot = args[0]; token = args[1]; } else //En caso contrario se piden por consola { Scanner lecturaTeclado = new Scanner(System.in); System.out.print("Introduce el nombre de usuario del Bot de Telegram: "); usuarioBot = lecturaTeclado.nextLine(); System.out.print("Introduce el token del Bot de Telegram: "); token = lecturaTeclado.nextLine(); } if (token.isEmpty() || usuarioBot.isEmpty()) { System.out.print("Debe introducir un usuario y un " + "token correctos o pasarlos como parámetro."); } else { ApiContextInitializer.init(); TelegramBotsApi botsApi = new TelegramBotsApi(); try { botsApi.registerBot(new Main()); System.out.println(FechaActual() + " Escuchando mensajes..."); } catch (TelegramApiException e) { System.out.println(FechaActual() + " Error " + e.getMessage()); } } } //Ejecuta un comando del sistema operativo y devuelve el resultado en un String public static String EjecutarComando (String comando) { try { System.out.println(FechaActual() + " Ejecutando comando [" + comando + "]..."); //Ejecutamos el comando en el sistema operativo //Devolverá el resultado en resultadoComando Process resultadoComando = Runtime.getRuntime().exec(comando); System.out.println(FechaActual() + " Comando [" + comando + "] ejecutado"); //Leemos el resultadoComando para enviarlo al bot de Telegram InputStream inputstream = resultadoComando.getInputStream(); BufferedInputStream bufferedinputstream = new BufferedInputStream(inputstream); BufferedReader br = new BufferedReader (new InputStreamReader (bufferedinputstream)); String lineaSalida; StringBuffer contenido = new StringBuffer(); //Recorremos el búfer para pasar sus líneas de texto a string while ((lineaSalida = br.readLine()) != null) { contenido.append(System.lineSeparator() + lineaSalida.trim()); } return contenido.toString(); } catch (IOException e) { String resultadoError = " Error al ejecutar comando [" + comando + "] " + e.getMessage(); System.out.println(FechaActual() + " " + resultadoError); return resultadoError; } } //Función que devuelve la fecha y hora actuales con // formato año-mes-dia hora:minuto:segundo:milisegundo public static String FechaActual() { Date fechaHoraActual = new Date(); return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(fechaHoraActual); } } |
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»:

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

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…»:

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…»:

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

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

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:

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

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

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

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):

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

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:

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:

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

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, …):

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]:

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

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

Y ejecutaremos el JAR con el comando Java:
java -cp TelegramBotComandoSistemaOperativo.jar Main «Nombre_Usuario_Bot_Telegram» «Token_Seguridad_Bot_Telegram»

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:

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

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

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:

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

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:

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 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:

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:

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:
1 2 |
#!/bin/sh mysql -h localhost -u UsuarioBD -pContraseñaUsuario -D NombreBaseDatos -s -e "SELECT cout(*) from nuke_users;" |
Guardaremos el contenido anterior en un fichero, por ejemplo con el nombre «num_usuarios.sh»:

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:

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:

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:

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:

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

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á:

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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
public void onUpdateReceived(Update actualizacionEstado) { String comandoLeido; String resultadoComando; boolean superaCaracteres = false; // Comprobamos si hay mensaje y si el mensaje es de texto if (actualizacionEstado.hasMessage() && actualizacionEstado.getMessage().hasText()) { comandoLeido = actualizacionEstado.getMessage().getText(); int longitudResultadoOriginal = 0; //Antes de ejecutar el comando comprobamos si el chatID está permitido if (actualizacionEstado.getMessage().getChatId() == 111222333) { //Ejecutamos el comando que se ha enviado por Telegram en el sistema operativo //y obtenemos el resultado del comando para enviarlo al chat origen de Telegram resultadoComando = EjecutarComando(comandoLeido); longitudResultadoOriginal = resultadoComando.length(); //System.out.println (FechaActual() + "Resultado comando: " + resultadoComando); //El resultado no debe exceder los 4092 caracteres que //es el máximo permitido para un mensaje de Telegram System.out.println(FechaActual() + " Número caracteres de resultado original a enviar a Telegram: " + longitudResultadoOriginal); //Si supera los 4092 caracteres lo acortamos para que no dé error //el envío de mensaje a Telegram if (longitudResultadoOriginal > 4090) { superaCaracteres = true; resultadoComando = resultadoComando.substring(0, 4090); System.out.println(FechaActual() + " Número caracteres de mensaje acortado a enviar a Telegram: " + resultadoComando.length()); } if (resultadoComando.isEmpty()) { resultadoComando = "El comando [" + comandoLeido + "] no ha devuelto resultado"; } } else { resultadoComando = "No tiene permitido ejecutar comandos en este Bot"; } //Creamos objeto SendMessage SendMessage mensaje = new SendMessage( actualizacionEstado.getMessage().getChatId(), "Resultado del comando: [" + comandoLeido + "]" + System.lineSeparator() + resultadoComando); try { execute(mensaje); //Enviamos el mensaje al chat de Telegram System.out.println (FechaActual() + " Mensaje enviado con resultado de " + "comando a chat de Telegram [" + mensaje.getChatId() + "]"); //Si el resultado del comando supera los 4095 caracteres //se enviará un segundo mensaje avisando de que se ha acortado if (superaCaracteres) { //Enviamos un segundo mensaje indicando que el resultado supera //el máximo de caracteres de Telegram y ha sido acortado SendMessage mensajeAvisoAcortado = new SendMessage( actualizacionEstado.getMessage().getChatId(), "El resultado ha sido acortado, el original ocupaba " + longitudResultadoOriginal + " caracteres. Por lo tanto supera el máximo" + " permitido por mensaje de Telegram, que es de 4092 caracteres. Se" + " recomienda usar formatos y filtros de salida " + "de los comandos para que no lo superen"); execute(mensajeAvisoAcortado); } } catch (TelegramApiException e) { System.out.println (FechaActual() + " Error " + e.getMessage()); } } } |
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:

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: