Acesso ao servidor Linux através de um bot do Telegram em Python

Com frequência, ocorrem situações em que o acesso ao servidor é necessário aqui e agora. No entanto, nem sempre a conexão via SSH é o método mais conveniente, pois pode não haver um cliente SSH, o endereço do servidor ou a combinação "usuário/senha" à mão. Claro, há Webmin, que simplifica a administração, mas também não fornece acesso instantâneo.

Portanto, decidi implementar uma solução simples, mas interessante. Ou seja, escrever um bot do Telegram que, sendo executado no próprio servidor, execute os comandos enviados e retorne o resultado. Após estudar alguns de artigos sobre o tema, percebi que ninguém havia descrito implementações semelhantes.

Eu realizei este projeto no Ubuntu 16.04, mas para garantir a execução sem problemas em outras distribuições, fiz o possível para deixá-lo em um formato geral.

Registro do bot

Vamos registrar um novo bot com o @BotFather. Enviamos a ele /newbot e assim por diante. Precisaremos do token do novo bot e do seu id (você pode obtê-lo, por exemplo, com @userinfobot).

Preparação do Python

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

Iniciando o bot

No servidor, criamos o arquivo bot.py:
nano bot.py

E inserimos o código:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token do bot
user_id = 0 #id da sua conta
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #verificamos se é o dono que está escrevendo
      comand = message.text  #texto da mensagem
      try: #se o comando não puder ser executado - check_output gerará uma exceção
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Entrada inválida") #se o comando for incorreto
if __name__ == '__main__':
    while True:
        try:#adicionamos try para funcionamento ininterrupto
            bot.polling(none_stop=True)#inicia o bot
        except:
            time.sleep(10)#em caso de falha

Substitua o token do bot pelo que foi fornecido pelo @BotFather e o user_id pelo 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 a você. A função check_output() executa o comando recebido e retorna o resultado.

Agora só resta iniciar o bot. Para iniciar processos no servidor, eu prefiro usar screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(onde "ServerBot" é o identificador do processo)

O processo será iniciado automaticamente em segundo plano. Vamos entrar em diálogo com o bot e verificar se tudo funciona como deveria:

Acesso ao servidor Linux através de um bot do Telegram em Python

Parabéns! O bot está executando os comandos que lhe são enviados. Agora, para acessar o servidor, basta abrir o diálogo com o bot.

Repetição de comandos

Frequentemente, para monitorar o estado do servidor, é necessário executar os mesmos comandos. Portanto, a implementação da repetição de comandos sem o reenvio dos mesmos será muito útil.

Vamos implementar isso através de botões inline sob as mensagens:

from subprocess import check_output
import telebot
from telebot import types # Adicionando importação de botões
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") # Token do bot
user_id = 0 # id da sua conta
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): # verificamos se a mensagem é do proprietário
      comand = message.text  # texto da mensagem
      markup = types.InlineKeyboardMarkup() # criamos o teclado
      button = types.InlineKeyboardButton(text="Repetir", callback_data=comand) # criamos o botão
      markup.add(button) # adicionamos o botão ao teclado
      try: # se o comando não puder ser executado - check_output gerará uma exceção
         bot.send_message(user_id, check_output(comand, shell=True, reply_markup=markup)) # chamamos o comando e enviamos a mensagem com o resultado
      except:
         bot.send_message(user_id, "Entrada inválida") # se o comando for incorreto

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data # lemos o comando do campo data do botão
  try: # se o comando não puder ser executado - check_output gerará uma exceção
     markup = types.InlineKeyboardMarkup() # criamos o teclado
     button = types.InlineKeyboardButton(text="Repetir", callback_data=comand) # criamos o botão e passamos o comando em data
     markup.add(button) # adicionamos o botão ao teclado
     bot.send_message(user_id, check_output(comand, shell=True), reply_markup=markup) # chamamos o comando e enviamos a mensagem com o resultado
  except:
     bot.send_message(user_id, "Entrada inválida") # se o comando for incorreto

if __name__ == '__main__':
    while True:
        try: # adicionamos try para operação ininterrupta
            bot.polling(none_stop=True) # iniciando o bot
        except:
            time.sleep(10) # no caso de falha

Reiniciando o bot:

killall python3
screen -dmS ServerBot python3 bot.py

Vamos verificar novamente se tudo está funcionando corretamente:

Acesso ao servidor Linux através de um bot do Telegram em Python

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

Em conclusão

Certamente, esse método não pretende substituir os modos clássicos de conexão, no entanto, permite saber rapidamente o estado do servidor e enviar comandos, que não exigem uma saída complexa.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster