Acesso ao servidor linux usando o Python Telegram bot

Muitas vezes, existem situações em que o acesso ao servidor é necessário aqui e agora. No entanto, a conexão SSH nem sempre é a maneira mais conveniente, pois o cliente SSH, o endereço do servidor ou o link do usuário / senha pode não estar disponível. Obviamente, existe o 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 de Telegram, que, começando no próprio servidor, executará os comandos enviados a ele e retornará o resultado. Depois de estudar vários artigos sobre esse tópico, percebi que ninguém havia descrito essas implementações ainda.

Eu implementei este projeto no Ubuntu 16.04, mas, para um lançamento sem problemas em outras distribuições, tentei fazer tudo de uma maneira geral.

Bot Registration


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

Preparação Python


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

Lançamento do bot


No servidor, crie o arquivo bot.py:
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 de bot nele pelo que o @BotFather emitiu e user_id pelo valor do ID da sua conta. A verificação da identificação do usuário é necessária para que o bot forneça acesso ao seu servidor apenas para você. A função check_output() executa o comando passado e retorna o resultado.

Resta apenas o lançamento do bot. Para iniciar processos no servidor, prefiro usar a screen ( 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:



Parabéns! O bot executa os comandos enviados a ele. Agora, para obter acesso ao servidor, basta abrir uma caixa de diálogo com o bot.

Repetição de comandos


Freqüentemente, para monitorar o status do servidor, você deve executar os mesmos comandos. Portanto, a implementação da repetição de comandos sem enviá-los novamente ficará muito fora de lugar.

Vamos implementar usando os botões embutidos sob as 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)#   

Reinicie o bot:

 killall python3 screen -dmS ServerBot python3 bot.py 

Verifique novamente se tudo funciona corretamente:



Pressionando o botão abaixo da mensagem, o bot deve repetir o comando a partir do qual a 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, no entanto, permite que você descubra rapidamente o status do servidor e envie comandos a ele que não exigem saída complexa.

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


All Articles