Acceso ao servidor linux usando o bot de Telegram en Python

Moitas veces hai situacións nas que se necesita acceso ao servidor aquí e agora. Non obstante, conectarse a través de SSH non sempre é o xeito máis cómodo, porque é posible que non teñas a man un cliente SSH, un enderezo de servidor ou unha combinación de usuario/contrasinal. Por suposto que ten Webmin, que simplifica a administración, pero tampouco proporciona acceso instantáneo.

Entón decidín implementar unha solución sinxela pero interesante. É dicir, escribir un bot de Telegram que, cando se lance no propio servidor, executará os comandos que lle envíen e devolverá o resultado. Ter estudado algúns artigos sobre este tema, decateime de que ninguén describiu aínda tales implementacións.

Implementei este proxecto en Ubuntu 16.04, pero para unha execución sen problemas noutras distribucións, tentei facer todo dun xeito xeral.

Rexistro de bot

Rexistra un novo bot con @BotFather. Enviámosllelo /newbot e máis adiante no texto. Necesitaremos un novo token de bot e o teu ID (pode obtelo, por exemplo, de @userinfobot).

Preparación de Python

Para executar o bot, utilizaremos a biblioteca telebot (pip install pytelegrambotapi). Usando a biblioteca subprocess executaremos comandos no servidor.

Lanzamento de bot

Crea un ficheiro bot.py no servidor:
nano bot.py

E pega o código nel:

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

Substituímos o token de bot que hai no mesmo polo emitido por @BotFather e user_id co valor de id da túa conta. É necesario comprobar o identificador de usuario para que o bot ofreza acceso ao teu servidor só a ti. Función check_output() executa o comando dado e devolve o resultado.

Só queda iniciar o bot. Para executar procesos no servidor, prefiro usar screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(onde "ServerBot" é o ID do proceso)

O proceso executarase automaticamente en segundo plano. Imos ao diálogo co bot e comprobemos que todo funciona como debería:

Acceso ao servidor linux usando o bot de Telegram en Python

Parabéns! O bot executa os comandos que lle envían. Agora, para acceder ao servidor, só tes que abrir un diálogo co bot.

Repetición de comandos

Moitas veces, para supervisar o estado do servidor, tes que executar os mesmos comandos. Polo tanto, a implementación de comandos repetidos sen reenvialos estará moi fóra de lugar.

Implementarémolo usando botóns en liña baixo as mensaxes:

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

killall python3
screen -dmS ServerBot python3 bot.py

Comprobamos de novo que todo funciona correctamente:

Acceso ao servidor linux usando o bot de Telegram en Python

Ao premer o botón debaixo da mensaxe, o bot debe repetir o comando desde o que se enviou esta mensaxe.

En vez de unha conclusión

Por suposto, este método non pretende ser un substituto dos métodos de conexión clásicos, non obstante, permítelle coñecer rapidamente o estado do servidor e enviarlle comandos que non requiren unha saída complexa.

Fonte: www.habr.com

Engadir un comentario