Acceso al servidor Linux usando el bot de Python Telegram

Muy a menudo hay situaciones en las que se necesita acceso al servidor aquí y ahora. Sin embargo, la conexión SSH no siempre es la forma más conveniente, porque el cliente SSH, la dirección del servidor o el enlace de usuario / contraseña pueden no estar disponibles. Por supuesto, existe Webmin , que simplifica la administración, pero tampoco brinda acceso instantáneo.

Entonces decidí implementar una solución simple pero interesante. Es decir, escribir un bot de Telegram, que, comenzando en el servidor mismo, ejecutará los comandos que se le envíen y devolverá el resultado. Después de estudiar varios artículos sobre este tema, me di cuenta de que nadie ha descrito tales implementaciones todavía.

Implementé este proyecto en Ubuntu 16.04, pero para un lanzamiento sin problemas en otras distribuciones, intenté hacer todo de manera general.

Registro de bot


Registre un nuevo bot con @BotFather. Le enviamos /newbot y más adelante en el texto. Necesitaremos el token del nuevo bot y su identificación (puede obtenerlo, por ejemplo, de @userinfobot ).

Preparación de pitón


Para iniciar el bot, utilizaremos la biblioteca telebot ( pip install pytelegrambotapi ). Usando la biblioteca de subprocess , ejecutaremos comandos en el servidor.

Lanzamiento de bot


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

Y pegue el código en él:

 from subprocess import check_output import telebot import time bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#  user_id = 0 #id   @bot.message_handler(content_types=["text"]) def main(message): if (user_id == message.chat.id): #,     comand = message.text #  try: #   - check_output  exception bot.send_message(message.chat.id, check_output(comand, shell = True)) except: bot.send_message(message.chat.id, "Invalid input") #   if __name__ == '__main__': while True: try:# try    bot.polling(none_stop=True)#  except: time.sleep(10)#   

Reemplazamos el token bot con el que emitió @BotFather y user_id con el valor de identificación de su cuenta. Es necesario verificar la identificación del usuario para que el bot le proporcione acceso a su servidor solo a usted. La función check_output() ejecuta el comando pasado y devuelve el resultado.

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

 screen -dmS ServerBot python3 bot.py 
(donde "ServerBot" es el identificador de proceso)

El proceso comenzará automáticamente en segundo plano. Vamos al diálogo con el bot y verifiquemos que todo funcione como debería:



Felicidades El bot ejecuta los comandos que se le envían. Ahora, para obtener acceso al servidor, solo necesita abrir un diálogo con el bot.

Repetición de comandos


A menudo, para monitorear el estado del servidor, debe ejecutar los mismos comandos. Por lo tanto, la implementación de la repetición de comandos sin enviarlos nuevamente estará muy fuera de lugar.

Implementaremos usando los botones en línea debajo de los mensajes:

 from subprocess import check_output import telebot from telebot import types #   import time bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#  user_id = 0 #id   @bot.message_handler(content_types=["text"]) def main(message): if (user_id == message.chat.id): #,     comand = message.text #  markup = types.InlineKeyboardMarkup() #  button = types.InlineKeyboardButton(text="", callback_data=comand) #  markup.add(button) #    try: #   - check_output  exception bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) #       except: bot.send_message(user_id, "Invalid input") #   @bot.callback_query_handler(func=lambda call: True) def callback(call): comand = call.data #     data try:#    - check_output  exception markup = types.InlineKeyboardMarkup() #  button = types.InlineKeyboardButton(text="", callback_data=comand) #    data   markup.add(button) #    bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #       except: bot.send_message(user_id, "Invalid input") #   if __name__ == '__main__': while True: try:# try    bot.polling(none_stop=True)#  except: time.sleep(10)#   

Reinicia el bot:

 killall python3 screen -dmS ServerBot python3 bot.py 

Verifique nuevamente que todo funcione correctamente:



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

En lugar de una conclusión


Por supuesto, este método no pretende ser un reemplazo de los métodos de conexión clásicos, sin embargo, le permite conocer rápidamente el estado del servidor y enviarle comandos que no requieren una salida compleja.

Source: https://habr.com/ru/post/443846/


All Articles