Acceso al servidor Linux usando el bot de Telegram en Python

Muy a menudo hay situaciones en las que se necesita acceso al servidor aquí y ahora. Sin embargo, conectarse a través de SSH no siempre es la forma más conveniente, ya que es posible que no tenga a mano un cliente SSH, una dirección de servidor o una combinación de usuario y contraseña. Por supuesto que tengo webmin, que simplifica la administración, pero tampoco proporciona acceso instantáneo.

Así que decidí implementar una solución simple pero interesante. Es decir, escribir un bot de Telegram que, cuando se inicie en el propio servidor, ejecutará los comandos que se le envíen y devolverá el resultado. haber estudiado varios artículos sobre este tema, me di cuenta de que nadie ha descrito aún tales implementaciones.

Implementé este proyecto en Ubuntu 16.04, pero para una ejecución sin problemas en otras distribuciones, traté de hacer todo de manera general.

registro de bots

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

Preparación de Python

Para ejecutar el bot, usaremos la biblioteca. telebot (pip install pytelegrambotapi). Uso de la biblioteca subprocess ejecutaremos comandos en el servidor.

Lanzamiento de bots

Cree un archivo bot.py en el servidor:
nano bot.py

Y pega 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 de bot con el emitido por @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. Función check_output() ejecuta el comando dado y devuelve el resultado.

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

screen -dmS ServerBot python3 bot.py

(donde "ServerBot" es el ID del proceso)

El proceso se ejecutará automáticamente en segundo plano. Vamos al diálogo con el bot y comprobamos que todo funciona como debería:

Acceso al servidor Linux usando el bot de Telegram en Python

¡Felicidades! El bot ejecuta los comandos que se le envían. Ahora, para acceder 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 comandos repetidos sin reenviarlos estará muy fuera de lugar.

Lo implementaremos usando 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)#в случае падения

Reiniciando el bot:

killall python3
screen -dmS ServerBot python3 bot.py

Comprobemos de nuevo que todo funciona correctamente:

Acceso al servidor Linux usando el bot de Telegram en Python

Al presionar el botón debajo del mensaje, el bot debe repetir el comando desde el cual se envió este 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.

Fuente: habr.com

Añadir un comentario