Juurdepääs linuxi serverile Pythonis Telegrami roboti abil

Üsna sageli tuleb ette olukordi, kus ligipääsu serverile on vaja siin ja praegu. SSH kaudu ühenduse loomine ei ole aga alati kõige mugavam viis, sest sul ei pruugi käepärast olla SSH klienti, serveri aadressi ega kasutaja/parooli kombinatsiooni. Muidugi on Webmin, mis lihtsustab haldust, kuid ei paku ka kohest juurdepääsu.

Seega otsustasin rakendada lihtsa, kuid huvitava lahenduse. Nimelt kirjutada Telegrami bot, mis serveris endas käivitades täidab talle saadetud käsud ja tagastab tulemuse. Olles õppinud mõned artiklid sellel teemal sain aru, et selliseid teostusi pole veel keegi kirjeldanud.

Rakendasin selle projekti Ubuntu 16.04-s, kuid probleemideta töötamiseks teistes distributsioonides püüdsin kõike teha üldiselt.

Boti registreerimine

Registreerige @BotFatheriga uus robot. Saadame ta /newbot ja edasi tekstis. Vajame uut bot-märki ja teie ID-d (saate selle hankida näiteks aadressilt @kasutajainfobot).

Pythoni ettevalmistus

Boti käivitamiseks kasutame raamatukogu telebot (pip install pytelegrambotapi). Raamatukogu kasutamine subprocess täidame serveris käske.

Boti käivitamine

Looge serveris fail bot.py:
nano bot.py

Ja kleepige kood sinna:

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

Asendame selles oleva boti märgiga @BotFather väljastatavaga ja user_id teie konto ID väärtusega. Kasutaja ID kontrollimine on vajalik, et robot võimaldaks juurdepääsu teie serverile ainult teile. Funktsioon check_output() täidab antud käsu ja tagastab tulemuse.

Jääb vaid robot käivitada. Serveris protsesside käitamiseks eelistan kasutada screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kus "ServerBot" on protsessi ID)

Protsess käivitub automaatselt taustal. Lähme dialoogi robotiga ja kontrollime, kas kõik töötab nii, nagu peab:

Juurdepääs linuxi serverile Pythonis Telegrami roboti abil

Palju õnne! Bot täidab talle saadetud käsud. Nüüd peate serverile juurdepääsuks lihtsalt avama dialoogi robotiga.

Käskude kordamine

Sageli peate serveri oleku jälgimiseks täitma samu käske. Seetõttu on korduvate käskude rakendamine ilma neid uuesti saatmata väga kohatu.

Rakendame selle sõnumite all olevate siseste nuppude abil:

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

Boti taaskäivitamine:

killall python3
screen -dmS ServerBot python3 bot.py

Kontrollime uuesti, kas kõik töötab õigesti:

Juurdepääs linuxi serverile Pythonis Telegrami roboti abil

Vajutades sõnumi all olevat nuppu, peab bot kordama käsku, millest see teade saadeti.

Selle asemel, et järeldus

Loomulikult ei pretendeeri see meetod klassikaliste ühendusmeetodite asendusena, kuid võimaldab teil kiiresti teada saada serveri oleku ja saata sellele käske, mis ei vaja keerulist väljundit.

Allikas: www.habr.com

Lisa kommentaar