Приступ линук серверу помоћу Телеграм бота у Питһон-у

Често постоје ситуације када је приступ серверу потребан овде и сада. Међутим, повезивање преко ССХ-а није увек најпогоднији начин, јер можда немате при руци ССХ клијента, адресу сервера или комбинацију корисника/лозинке. Наравно да имам Вебмин, што поједностављује администрацију, али такође не пружа тренутни приступ.

Зато сам одлучио да применим једноставно, али занимљиво решење. Наиме, да се напише Телеграм бот који ће, када се покрене на самом серверу, извршавати команде које су му послате и враћати резултат. Проучивши неки чланци на ову тему, схватио сам да такве имплементације још нико није описао.

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

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

Региструјте новог бота са @БотФатхер. Ми га шаљемо /newbot и даље у тексту. Биће нам потребан нови токен бота и ваш ИД (можете га добити, на пример, од @усеринфобот).

Припрема за Питхон

За покретање бота користићемо библиотеку telebot (pip install pytelegrambotapi). Коришћење библиотеке subprocess извршићемо команде на серверу.

Покретање бота

Направите бот.пи датотеку на серверу:
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)#в случае падения

Ми замењујемо бот токен у њему оним који је издао @БотФатхер, а усер_ид са вредношћу ид вашег налога. Провера корисничког ИД-а је потребна како би бот омогућио приступ вашем серверу само вама. Функција check_output() извршава дату команду и враћа резултат.

Остаје само да покренете бот. За покретање процеса на серверу, радије користим screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(где је „СерверБот“ ИД процеса)

Процес ће се аутоматски покренути у позадини. Идемо у дијалог са ботом и проверимо да ли све ради како треба:

Приступ линук серверу помоћу Телеграм бота у Питһон-у

Честитам! Бот извршава команде које су му послате. Сада, да бисте приступили серверу, потребно је само да отворите дијалог са ботом.

Понављање команде

Често, да бисте пратили стање сервера, морате извршити исте команде. Стога ће имплементација понављања команди без њиховог поновног слања бити веома депласирана.

Имплементираћемо га помоћу уграђених дугмади испод порука:

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

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

Приступ линук серверу помоћу Телеграм бота у Питһон-у

Притиском на дугме испод поруке бот мора да понови команду са које је ова порука послата.

Уместо закључка

Наравно, овај метод не претендује да буде замена за класичне методе повезивања, али вам омогућава да брзо сазнате о стању сервера и пошаљете му команде које не захтевају сложени излаз.

Извор: ввв.хабр.цом

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