Prieiga prie „Linux“ serverio naudojant „Telegram“ robotą „Python“.

Gana dažnai pasitaiko situacijų, kai prieiti prie serverio reikia čia ir dabar. Tačiau prisijungimas per SSH ne visada yra patogiausias būdas, nes po ranka galite neturėti SSH kliento, serverio adreso ar vartotojo/slaptažodžio derinio. Žinoma turi Webmin, kuris supaprastina administravimą, tačiau taip pat nesuteikia momentinės prieigos.

Taigi nusprendžiau įgyvendinti paprastą, bet įdomų sprendimą. Būtent parašyti Telegram botą, kuris paleistas pačiame serveryje vykdys jam siunčiamas komandas ir grąžins rezultatą. Išmokęs šiek tiek straipsniai šia tema supratau, kad tokių įgyvendinimų dar niekas neaprašė.

Įgyvendinau šį projektą Ubuntu 16.04 versijoje, tačiau, kad kitose distribucijose veiktų be problemų, bandžiau viską padaryti bendrai.

Botų registracija

Užregistruokite naują robotą su @BotFather. Mes jį siunčiame /newbot ir toliau tekste. Mums reikės naujo roboto prieigos rakto ir jūsų ID (jį galite gauti, pavyzdžiui, iš @userinfobot).

Python paruošimas

Norėdami paleisti robotą, naudosime biblioteką telebot (pip install pytelegrambotapi). Naudojimasis biblioteka subprocess vykdysime komandas serveryje.

Boto paleidimas

Sukurkite bot.py failą serveryje:
nano bot.py

Ir įklijuokite kodą į jį:

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

Jame esantį roboto prieigos raktą pakeičiame @BotFather išduotu, o user_id - jūsų paskyros ID verte. Patikrinti vartotojo ID reikia, kad robotas suteiktų prieigą prie jūsų serverio tik jums. Funkcija check_output() įvykdo duotą komandą ir grąžina rezultatą.

Belieka tik paleisti robotą. Norėdami paleisti procesus serveryje, norėčiau naudoti screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kur „ServerBot“ yra proceso ID)

Procesas bus automatiškai paleistas fone. Pereikime prie dialogo su robotu ir patikrinkime, ar viskas veikia taip, kaip turėtų:

Prieiga prie „Linux“ serverio naudojant „Telegram“ robotą „Python“.

Sveikiname! Botas vykdo jam siunčiamas komandas. Dabar, norėdami pasiekti serverį, tereikia pradėti dialogą su robotu.

Komandos kartojimas

Dažnai norėdami stebėti serverio būseną, turite vykdyti tas pačias komandas. Todėl pasikartojančių komandų įgyvendinimas jų nesiunčiant iš naujo bus labai netinkamas.

Ją įgyvendinsime naudodami eilutinius mygtukus po pranešimais:

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

Boto paleidimas iš naujo:

killall python3
screen -dmS ServerBot python3 bot.py

Dar kartą patikrinkime, ar viskas veikia tinkamai:

Prieiga prie „Linux“ serverio naudojant „Telegram“ robotą „Python“.

Paspaudus mygtuką po pranešimu, robotas turi pakartoti komandą, iš kurios buvo išsiųstas šis pranešimas.

Vietoj išvados

Žinoma, šis metodas nepretenduoja į klasikinių prisijungimo būdų pakaitalą, tačiau leidžia greitai sužinoti apie serverio būseną ir siųsti jam komandas, kurioms nereikia sudėtingos išvesties.

Šaltinis: www.habr.com

Добавить комментарий