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

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

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

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

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

Регистрирайте нов бот с @BotFather. Изпращаме го /newbot и по-нататък в текста. Ще ни трябва нов токен за бот и вашия идентификатор (можете да го получите например от @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 выдаст 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)#в случае падения

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

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

screen -dmS ServerBot python3 bot.py

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

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

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

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

killall python3
screen -dmS ServerBot python3 bot.py

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

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

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

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

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

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

Добавяне на нов коментар