Acesso ao servidor linux usando o bot Telegram em Python

Muitas vezes, há situações em que o acesso ao servidor é necessário aqui e agora. No entanto, conectar via SSH nem sempre é a maneira mais conveniente, porque você pode não ter um cliente SSH, endereço de servidor ou combinação de usuário/senha em mãos. claro que tem Webmin, que simplifica a administração, mas também não fornece acesso instantâneo.

Então decidi implementar uma solução simples, mas interessante. Ou seja, escrever um bot do Telegram que, ao ser lançado no próprio servidor, executará os comandos enviados a ele e retornará o resultado. tendo estudado alguns artigos sobre este tópico, percebi que ninguém ainda descreveu tais implementações.

Implementei este projeto no Ubuntu 16.04, mas para rodar sem problemas em outras distribuições, tentei fazer tudo de forma geral.

Registro de bot

Registre um novo bot com @BotFather. Nós o enviamos /newbot e mais adiante no texto. Vamos precisar de um novo token de bot e seu id (você pode obtê-lo, por exemplo, em @userinfobot).

preparação Python

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

Lançamento de bot

Crie um arquivo bot.py no servidor:
nano bot.py

E cole o código nele:

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 do bot por aquele emitido por @BotFather e user_id pelo valor id da sua conta. A verificação do ID do usuário é necessária para que o bot forneça acesso ao seu servidor apenas para você. Função check_output() executa o comando fornecido e retorna o resultado.

Resta apenas iniciar o bot. Para executar processos no servidor, prefiro usar screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(onde "ServerBot" é o ID do processo)

O processo será executado automaticamente em segundo plano. Vamos ao diálogo com o bot e verificamos se tudo funciona como deveria:

Acesso ao servidor linux usando o bot Telegram em Python

Parabéns! O bot executa os comandos enviados a ele. Agora, para acessar o servidor, basta abrir um diálogo com o bot.

repetição de comando

Freqüentemente, para monitorar o estado do servidor, você precisa executar os mesmos comandos. Portanto, a implementação de comandos repetidos sem reenviá-los ficará muito deslocada.

Vamos implementá-lo usando botões embutidos nas mensagens:

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

Vamos verificar novamente se tudo funciona corretamente:

Acesso ao servidor linux usando o bot Telegram em Python

Ao pressionar o botão abaixo da mensagem, o bot deve repetir o comando do qual esta mensagem foi enviada.

Em vez de uma conclusão

Obviamente, esse método não pretende substituir os métodos clássicos de conexão, mas permite que você descubra rapidamente o estado do servidor e envie comandos para ele que não exijam saída complexa.

Fonte: habr.com

Adicionar um comentário