Пристап до Linux сервер користејќи Telegram бот во Python

Доста често има ситуации кога е потребен пристап до серверот овде и сега. Сепак, поврзувањето преку SSH не е секогаш најзгодниот метод, бидејќи можеби немате при рака SSH клиент, адреса на сервер или комбинација на корисник/лозинка. Секако дека има Webmin, што ја поедноставува администрацијата, но исто така не обезбедува моментален пристап.

Затоа решив да спроведам едноставно, но интересно решение. Имено, напишете Телеграм бот кој кога ќе се стартува на самиот сервер ќе ги извршува командите испратени до него и ќе го врати резултатот. Студирајќи некои статии На оваа тема, сфатив дека никој сè уште не опишал такви имплементации.

Го имплементирав овој проект на Ubuntu 16.04, но за непроблематична стартување на други дистрибуции се обидов да направам сè на општ начин.

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

Регистрирање на нов бот со @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“ е 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

Додадете коментар