Достъп до Linux сървър чрез Telegram бот на Python

Доста често се случват ситуации, в които достъпът до сървъра е необходим веднага. Въпреки това, не винаги свързването по SSH е най-удобният начин, тъй като под ръка може да няма SSH клиент, адрес на сървъра или комбинация "потребител/парола". Разбира се, има Webmin, който улеснява администрирането, но той също не дава незабавен достъп.

Затова реших да реализирам просто, но интересно решение. А именно — да напиша Telegram бот, който, стартирайки на самия сървър, ще изпълнява изпратените му команди и ще връща резултатите. Изучавайки няколко статии тази тема, разбрах, че подобни реализации все още не са описвани от никого.

Този проект реализирах на Ubuntu 16.04, но за безпроблемен старт на други дистрибуции се опитах да направя всичко в общ вид.

Регистрация на бота

Регистрираме нов бот при @BotFather. Изпращаме му /newbot и след това по текста. Ще ни трябват токенът на новия бот и вашето id (можете да го получите, например, от @userinfobot).

Подготовка на Python

За стартиране на бота ще използваме библиотеката telebot (pip install pytelegrambotapi). С помощта на библиотеката subprocess ще изпълняваме команди на сървера.

Стартиране на бота

На сървъра създаваме файл bot.py:
nano bot.py

И вмъкваме в него кода:

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 ще генерира изключение
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Невалиден вход") #ако командата е некоректна
if __name__ == '__main__':
    while True:
        try:#добавяме try за непрекъсната работа
            bot.polling(none_stop=True)#стартиране на бота
        except:
            time.sleep(10)#в случай на срив

Заменяме в него токена на бота с този, предоставен от @BotFather, и user_id — с вашето акаунт id. Проверка на id потребителя е необходима, за да ботът предоставя достъп до вашия сървър само на вас. Функцията check_output() изпълнява предадената команда и връща резултата.

Остава само да стартираме бота. За стартиране на процесите на сървъра предпочитам да използвам screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(където "ServerBot" е идентификаторът на процеса)

Процесът ще стартира автоматично във фонов режим. Нека да преминем в диалога с бота и да проверим дали всичко работи, както трябва:

Достъп до Linux сървър чрез Telegram бот на Python

Поздравления! Ботът изпълнява получените команди. Сега, за да получите достъп до сървъра, достатъчно е да отворите диалога с бота.

Повтаряне на команди

Често, за мониторинг на състоянието на сървъра, се налага да изпълнявате едни и същи команди. Затова реализирането на повтаряне на команди без повторно изпращане ще бъде много полезно.

Ще го реализираме с помощта на инлайн бутони под съобщенията:

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 ще генерира изключение
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) #извикваме командата и изпращаме съобщение с резултата
      except:
         bot.send_message(user_id, "Невалиден вход") #ако командата е некоректна

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data #прочитаме командата от полето данни на бутона
  try:#ако командата не може да бъде изпълнена - check_output ще генерира изключение
     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, "Невалиден вход") #ако командата е некоректна

if __name__ == '__main__':
    while True:
        try:#добавяме try за безпроблемна работа
            bot.polling(none_stop=True)#старт на бота
        except:
            time.sleep(10)#в случай на срив

Рестартиране на бота:

killall python3
screen -dmS ServerBot python3 bot.py

Нека отново проверим дали всичко работи коректно:

Достъп до Linux сървър чрез Telegram бот на Python

При натискане на бутона под съобщението, ботът трябва да повтори командата, от която е получено това съобщение.

Вместо заключение

Разбира се, този метод не претендира да замести класическите начини за свързване, но той позволява бързо да научите състоянието на сървъра и да му изпращате команди, които не изискват сложен изход.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster