Linux serveri ligipääs Telegram-boti kaudu Pythonis

Tihti esinevad olukorrad, kus serverisse on vajalik juurdepääs kohe ja praegu. Kuid mitte alati ei ole SSH-ühendus kõige mugavam, sest käsutuses võib mitte olla SSH-klienti, serveri aadressi või kasutaja/parooli kombinatsiooni. Muidugi, on olemas Webmin, mis lihtsustab haldamist, kuid see ei paku ka kohest juurdepääsu.

Seetõttu otsustasin rakendada lihtsat, kuid huvitavat lahendust. Nimelt — kirjutada Telegram-boti, mis, käivitades serveris, täidab talle saadetud käske ning tagastab tulemuse. Uurides mõningaid artikleid selle teema kohta, sain aru, et sarnaseid teostusi pole veel keegi kirjeldanud.

Selle projekti teostasin Ubuntu 16.04-l, kuid probleemideta käivitamiseks teistel distributsioonidel püüdsin teha kõik üldiselt.

Boti registreerimine

Registreerime uue boti @BotFather juures. Saadame talle /newbot ja edasi tekstis. Meile on vajalik uue boti token ja teie id (seda saab näiteks @userinfobot'ilt). @userinfobot).

Python'i ettevalmistamine

Boti käitamiseks kasutame teeki telebot (pip install pytelegrambotapi). Teegi subprocess kasutame serveri käskude täitmiseks.

Boti käivitamine

Serveris loome faili bot.py:
nano bot.py

Ja sisestame sellesse koodi:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#boti token
user_id = 0 #teie konto id
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #kontrollime, kas kirjutas tõepoolest omanik
      comand = message.text  #sõnumi tekst
      try: #kui käsk ei ole täidetav - check_output annab välja erandi
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Kehtetu sisend") #kui käsk on vale
if __name__ == '__main__':
    while True:
        try:#lisame try, et tööd oleks katkematu
            bot.polling(none_stop=True)#boti käivitamine
        except:
            time.sleep(10)#kui toimus tõrge

Asendame selles boti token'i selle, mille andis @BotFather, ja user_id — teie konto id väärtusega. Kasutaja id kontrollimine on vajalik, et bot annaks juurdepääsu teie serverile ainult teile. Funktsioon check_output() täidab edastatud käsu ja tagastab tulemuse.

Vajab ainult boti käivitamist. Protsesside käivitamiseks serveris eelistan kasutada screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kus „ServerBot” on protsessi identifikaator)

Protsess käivitub automaatselt taustal. Liigume vestluses boti juurde ja kontrollime, et kõik töötab õigesti:

Linux serveri ligipääs Telegram-boti kaudu Pythonis

Palju õnne! Bot täidab talle saadetud käske. Nüüd, et serverisse juurde pääseda, piisab, kui avada vestlus botiga.

Käskude kordamine

Tihti tuleb serveri seisundi jälgimiseks täita samu käske. Seetõttu on käskude kordamise rakendamine ilma nende uuesti saatmiseta väga vajalik.

Rakendame seda inline-nuppude abil sõnumite all:

from subprocess import check_output
import telebot
from telebot import types # Lisame nupud
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") # Boti token
user_id = 0 # teie konto id
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): # kontrollime, et kirjutab just omanik
      comand = message.text  # sõnumi tekst
      markup = types.InlineKeyboardMarkup() # loome klaviatuuri
      button = types.InlineKeyboardButton(text="Korrata", callback_data=comand) # loome nupu
      markup.add(button) # lisame nupu klaviatuuri
      try: # kui käsk ei ole teostatav - check_output viskab erandi
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) # kutsume käsku ja saadame sõnumi tulemusega
      except:
         bot.send_message(user_id, "Vale sisend") # kui käsk on vale

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data # loeme käsu nupu andmeväljast
  try: # kui käsk ei ole teostatav - check_output viskab erandi
     markup = types.InlineKeyboardMarkup() # loome klaviatuuri
     button = types.InlineKeyboardButton(text="Korrata", callback_data=comand) # loome nupu ja andmeväljas anname käsu
     markup.add(button) # lisame nupu klaviatuuri
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) # kutsume käsku ja saadame sõnumi tulemusega
  except:
     bot.send_message(user_id, "Vale sisend") # kui käsk on vale

if __name__ == '__main__':
    while True:
        try: # lisame try pideva töö tagamiseks
            bot.polling(none_stop=True) # käivitame boti
        except:
            time.sleep(10) # juhul kui see kukub

Taaskäivitame boti:

killall python3
screen -dmS ServerBot python3 bot.py

Kontrollime jälle, et kõik töötab õigesti:

Linux serveri ligipääs Telegram-boti kaudu Pythonis

Nupu vajutamisel bot peaks kordama käsku, millest see sõnum saadeti.

Lõpetuseks

Ilmselgelt ei saa see meetod klassikaliste ühendusmeetodite asenduseks, kuid see võimaldab küllaltki kiiresti teada saada serveri seisundist ja saata sellele käske, mis ei nõua keerulist väljundit.

Allikas: habr.com

Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid 🔥 Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster