Python тіліндегі Telegram боты арқылы Linux серверіне кіру

Мұнда және қазір серверге кіру қажет болған жағдайлар жиі кездеседі. Дегенмен, 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 шотының идентификатор мәніне ауыстырамыз. Пайдаланушы идентификаторын тексеру бот серверіңізге тек сізге ғана рұқсат беруі үшін қажет. Функция check_output() берілген команданы орындайды және нәтижені қайтарады.

Ботты іске қосу ғана қалады. Сервердегі процестерді іске қосу үшін мен пайдаланғым келеді screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(мұндағы "ServerBot" процесс идентификаторы)

Процесс автоматты түрде фондық режимде орындалады. Ботпен диалогқа барайық және бәрі дұрыс жұмыс істейтінін тексерейік:

Python тіліндегі Telegram боты арқылы Linux серверіне кіру

Құттықтаймыз! Бот оған жіберілген командаларды орындайды. Енді серверге кіру үшін сізге тек ботпен диалог ашу керек.

Пәрменді қайталау

Көбінесе сервердің күйін бақылау үшін бірдей пәрмендерді орындау керек. Сондықтан қайталама пәрмендерді оларды қайта жібермей орындау өте орынсыз болады.

Біз оны хабарламалар астындағы кірістірілген түймелер арқылы жүзеге асырамыз:

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

Барлығы дұрыс жұмыс істейтінін тағы бір рет тексерейік:

Python тіліндегі Telegram боты арқылы Linux серверіне кіру

Хабардың астындағы түймені басу арқылы бот осы хабарлама жіберілген пәрменді қайталауы керек.

Орнына жасасу

Әрине, бұл әдіс классикалық қосылу әдістерін алмастырмайды, дегенмен ол сервердің жай-күйі туралы жылдам білуге ​​және оған күрделі шығысты қажет етпейтін пәрмендерді жіберуге мүмкіндік береді.

Ақпарат көзі: www.habr.com

пікір қалдыру