Acceso a un servidor Linux a través de un bot de Telegram en Python

A menudo ocurren situaciones en las que se necesita acceso al servidor aquí y ahora. Sin embargo, no siempre la conexión por SSH es la forma más conveniente, ya que puede que no tengamos un cliente SSH, la dirección del servidor o las credenciales "usuario/contraseña" a mano. Por supuesto, hay Webmin, que simplifica la administración, pero tampoco proporciona acceso instantáneo.

Por lo tanto, decidí implementar una solución simple pero interesante. Específicamente, escribir un bot de Telegram que, al ejecutarse en el servidor, ejecute los comandos que se le envían y devuelva el resultado. Tras investigar varios artículos sobre este tema, me di cuenta de que nadie había descrito implementaciones similares.

Este proyecto lo realicé en Ubuntu 16.04, pero para garantizar un funcionamiento sin problemas en otras distribuciones, traté de hacerlo de manera general.

Registro del bot

Registramos un nuevo bot en @BotFather. Le enviamos /newbot y luego el texto. Necesitaremos el token del nuevo bot y tu id (se puede obtener, por ejemplo, de @userinfobot).

Preparación de Python

Para ejecutar el bot utilizaremos la biblioteca telebot (pip install pytelegrambotapi). Con la ayuda de la biblioteca subprocess ejecutaremos comandos en el servidor.

Inicio del bot

En el servidor, creamos el archivo bot.py:
nano bot.py

Y pegamos el siguiente código:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token del bot
user_id = 0 #id de tu cuenta
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #verificamos que el propietario sea quien escribe
      comand = message.text  #texto del mensaje
      try: #si el comando no se puede ejecutar, check_output lanzará una excepción
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Entrada inválida") #si el comando es incorrecto
if __name__ == '__main__':
    while True:
        try:#agregamos try para funcionamiento ininterrumpido
            bot.polling(none_stop=True)#iniciamos el bot
        except:
            time.sleep(10)#en caso de caída

Reemplacemos en él el token del bot con el que proporcionó @BotFather y user_id con el id de tu cuenta. La verificación del id del usuario es necesaria para que el bot proporcione acceso a tu servidor solo a ti. La función check_output() ejecuta el comando recibido y devuelve el resultado.

Solo falta iniciar el bot. Para lanzar procesos en el servidor, prefiero usar screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(donde "ServerBot" es el identificador del proceso)

El proceso se iniciará automáticamente en segundo plano. Vamos a chatear con el bot y comprobar que todo funciona como debería:

Acceso a un servidor Linux a través de un bot de Telegram en Python

¡Felicidades! El bot está ejecutando los comandos que le envías. Ahora, para acceder al servidor, solo necesitas abrir un chat con el bot.

Repetición de comandos

A menudo, para monitorear el estado del servidor, es necesario ejecutar los mismos comandos. Por lo tanto, la implementación de la repetición de comandos sin volver a enviarlos será muy útil.

Vamos a implementarlo usando botones en línea debajo de los mensajes:

from subprocess import check_output
import telebot
from telebot import types #Añadimos la importación de botones
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token del bot
user_id = 0 #id de tu cuenta
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #verificamos que lo escriba el propietario
      comand = message.text  #texto del mensaje
      markup = types.InlineKeyboardMarkup() #creamos el teclado
      button = types.InlineKeyboardButton(text="Repetir", callback_data=comand) #creamos el botón
      markup.add(button) #agregamos el botón al teclado
      try: #si el comando no puede ejecutarse - check_output lanzará una excepción
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) #invocamos el comando y enviamos el mensaje con el resultado
      except:
         bot.send_message(user_id, "Entrada inválida") #si el comando es incorrecto

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data #leemos el comando del campo de datos del botón
  try:#si el comando no puede ejecutarse - check_output lanzará una excepción
     markup = types.InlineKeyboardMarkup() #creamos el teclado
     button = types.InlineKeyboardButton(text="Repetir", callback_data=comand) #creamos el botón y pasamos el comando en los datos
     markup.add(button) #agregamos el botón al teclado
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #invocamos el comando y enviamos el mensaje con el resultado
  except:
     bot.send_message(user_id, "Entrada inválida") #si el comando es incorrecto

if __name__ == '__main__':
    while True:
        try:#añadimos try para un funcionamiento continuo
            bot.polling(none_stop=True)#iniciar el bot
        except:
            time.sleep(10)#en caso de caídas

Reiniciamos el bot:

killall python3
screen -dmS ServerBot python3 bot.py

Verifiquemos nuevamente que todo funcione correctamente:

Acceso a un servidor Linux a través de un bot de Telegram en Python

Al presionar el botón debajo del mensaje, el bot debe repetir el comando del cual se recibió este mensaje.

En conclusión

Sin duda, este método no pretende reemplazar las formas clásicas de conexión, sin embargo, permite obtener información sobre el estado del servidor y enviarle comandos que no requieran una salida compleja de manera relativamente rápida.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster