Accés al servidor Linux mitjançant el bot de Telegram a Python

Molt sovint hi ha situacions en què l'accés al servidor és necessari aquí i ara. Tanmateix, connectar-se mitjançant SSH no sempre és la manera més còmoda, perquè és possible que no tingueu a mà un client SSH, una adreça de servidor o una combinació d'usuari/contrasenya. Per descomptat tenir Webmin, que simplifica l'administració, però tampoc proporciona accés instantani.

Així que vaig decidir implementar una solució senzilla però interessant. És a dir, escriure un bot de Telegram que, en llançar-se al propi servidor, executarà les ordres que li enviïn i retorni el resultat. Havent estudiat alguns articles sobre aquest tema, em vaig adonar que ningú encara ha descrit aquestes implementacions.

Vaig implementar aquest projecte a Ubuntu 16.04, però per a una execució sense problemes en altres distribucions, vaig intentar fer-ho tot de manera general.

Registre de bot

Registreu un bot nou amb @BotFather. L'enviem /newbot i més enllà del text. Necessitarem un nou testimoni de bot i el vostre identificador (el podeu obtenir, per exemple, de @userinfobot).

Preparació de Python

Per executar el bot, utilitzarem la biblioteca telebot (pip install pytelegrambotapi). Ús de la Biblioteca subprocess executarem ordres al servidor.

Llançament de bot

Creeu un fitxer bot.py al servidor:
nano bot.py

I enganxeu-hi el codi:

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ïm el testimoni de bot que hi ha per l'emès per @BotFather i user_id amb el valor d'identificador del vostre compte. Cal comprovar l'identificador d'usuari perquè el bot us proporcioni accés al vostre servidor només a vosaltres. Funció check_output() executa l'ordre donada i retorna el resultat.

Només queda iniciar el bot. Per executar processos al servidor, prefereixo utilitzar screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(on "ServerBot" és l'ID del procés)

El procés s'executarà automàticament en segon pla. Anem al diàleg amb el bot i comprovem que tot funciona com cal:

Accés al servidor Linux mitjançant el bot de Telegram a Python

Felicitats! El bot executa les ordres que li envien. Ara, per accedir al servidor, només cal obrir un diàleg amb el bot.

Repetició d'ordres

Sovint, per controlar l'estat del servidor, heu d'executar les mateixes ordres. Per tant, la implementació de repetir ordres sense tornar-les a enviar serà molt fora de lloc.

Ho implementarem mitjançant botons en línia sota els missatges:

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

Reiniciant el bot:

killall python3
screen -dmS ServerBot python3 bot.py

Comprovem de nou que tot funciona correctament:

Accés al servidor Linux mitjançant el bot de Telegram a Python

En prémer el botó de sota del missatge, el bot ha de repetir l'ordre des de la qual s'ha enviat aquest missatge.

En lloc d'una conclusió

Per descomptat, aquest mètode no pretén ser un substitut dels mètodes de connexió clàssics, però us permet conèixer ràpidament l'estat del servidor i enviar-li ordres que no requereixen una sortida complexa.

Font: www.habr.com

Afegeix comentari