Доступ да сервера linux з дапамогай Telegram-бота на Python

Даволі часта адбываюцца сітуацыі, калі доступ да сервера патрэбен тут і зараз. Аднак, не заўсёды падлучэнне па SSH з'яўляецца найболей зручным спосабам, таму што пад рукой можа не апынуцца SSH кліента, адрасы сервера або звязкі «карыстальнік/пароль». Канешне ёсць Webmin, які спрашчае адміністраванне, але ён таксама не дае маментальны доступ.

Таму я вырашыў рэалізаваць простае, але цікавае рашэнне. А менавіта – напісаць Telegram-бота, які, запускаючыся на самім серверы, будзе выконваць дасыланыя яму каманды і вяртаць вынік. Вывучыўшы некалькі артыкулаў на гэтую тэму, я зразумеў, што падобных рэалізацый яшчэ ніхто не апісваў.

Дадзены праект я рэалізоўваў на Ubuntu 16.04/XNUMX, але для беспраблемнага запуску на іншых дыстрыбутывах я пастараўся зрабіць усё ў агульным выглядзе.

Рэгістрацыя бота

Рэгіструем новага робата ў @BotFather. Адпраўляем яму /newbot і далей па тэксце. Нам спатрэбяцца токен новага робата і ваш id (атрымаць яго можна, напрыклад, у @userinfobot).

Падрыхтоўка пітона

Для запуску бота будзем выкарыстоўваць бібліятэку 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 вашага акаўнта. Праверка id карыстача патрэбна для таго, каб робат падаваў доступ да вашага сервера толькі вам. Функцыя check_output() выконвае перададзеную каманду і вяртае вынік.

Засталося толькі запусціць робата. Для запуску працэсаў на серверы я аддаю перавагу выкарыстоўваць screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(дзе "ServerBot" - ідэнтыфікатар працэсу)

Працэс аўтаматычна запусціцца ў фонам рэжыме. Пяройдзем у дыялог з ботам і праверым, што ўсё працуе, як трэба:

Доступ да сервера linux з дапамогай Telegram-бота на Python

Сongratulations! Бот выконвае дасыланыя яму каманды. Зараз, каб атрымаць доступ да сервера, вам дастаткова адкрыць дыялог з ботам.

Паўтарэнне каманд

Часцяком, для маніторынгу стану сервера даводзіцца выконваць адны і тыя ж каманды. Таму рэалізацыя паўтору каманд без іх паўторнага адпраўлення будзе вельмі дарэчы.

Рэалізоўваць будзем пры дапамозе inline кнопак пад паведамленнямі:

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

Па націску кнопкі пад паведамленнем робат павінен паўтараць каманду, ад якой было даслана дадзенае паведамленне.

замест заключэння

Безумоўна, такі метад не прэтэндуе стаць заменай класічным спосабам падлучэння, аднак, ён дазваляе досыць хутка пазнаць аб стане сервера і адправіць яму каманды, не патрабавальныя складанай высновы.

Крыніца: habr.com

Дадаць каментар