Přístup k linuxovému serveru pomocí Telegram bota na Pythonu

Často sa stáva, že prístup k serveru je potrebný okamžite. Nie vždy je však pripojenie cez SSH najpohodlnejší spôsob, pretože nemusí byť poruke SSH klient, adresa servera alebo kombinácia „používateľ/heslo“. Samozrejme, existuje Webmin, ktorý zjednodušuje administráciu, ale tiež neposkytuje okamžitý prístup.

Preto som sa rozhodol implementovať jednoduché, ale zaujímavé riešenie. Konkrétne – napísať Telegram bota, ktorý, spúšťaný na samotnom serveri, vykonáva posielané mu príkazy a vracia výsledok. Po preskúmaní niekoľkých článkov na túto tému, som si uvedomil, že podobné implementácie nikto ešte nepopísal.

Tento projekt som realizoval na Ubuntu 16.04, ale pre bezproblémový chod na iných distribúciách som sa snažil urobiť všetko vo všeobecnej forme.

Registrácia bota

Zaregistrujeme nového bota u @BotFather. Posielame mu /newbot a pokračujeme v texte. Potrebujeme token nového bota a váš id (získať ho môžete napríklad cez @userinfobot).

Príprava Pythonu

Na spustenie bota budeme používať knižnicu telebot (pip install pytelegrambotapi). Pomocou knižnice subprocess budeme vykonávať príkazy na serveri.

Spustenie bota

Na serveri vytvoríme súbor bot.py:
nano bot.py

A vložíme do neho kód:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token bota
user_id = 0 #id vášho účtu
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #kontrolujeme, že píše práve majiteľ
      comand = message.text  #text správy
      try: #ak je príkaz nevykonateľný, - check_output vyhodí výnimku
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Neplatný vstup") #ak je príkaz nekorektný
if __name__ == '__main__':
    while True:
        try:#pridáme try pre bezproblémovú prevádzku
            bot.polling(none_stop=True)#spustenie bota
        except:
            time.sleep(10)#v prípade pádu

Nahradíme v ňom token bota tým, ktorý vydal @BotFather, a user_id – hodnotou id vášho účtu. Kontrola id používateľa je potrebná na to, aby bot poskytoval prístup k vášmu serveru len vám. Funkcia check_output() vykonáva prenesený príkaz a vracia výsledok.

Zostáva len spustiť bota. Na spustenie procesov na serveri uprednostňujem používať screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kde „ServerBot“ je identifikátor procesu)

Proces sa automaticky spustí na pozadí. Prejdeme do dialógu s botom a skontrolujeme, či všetko funguje, ako má:

Přístup k linuxovému serveru pomocí Telegram bota na Pythonu

Gratulujeme! Bot vykonáva príkazy, ktoré mu posielate. Teraz stačí otvoriť dialóg s botom, aby ste získali prístup k serveru.

Opakovanie príkazov

Často je potrebné na monitorovanie stavu servera vykonávať tie isté príkazy. Preto bude veľmi užitočné implementovať opakovanie príkazov bez ich opätovného posielania.

Implementovať budeme pomocou inline tlačidiel pod správami:

from subprocess import check_output
import telebot
from telebot import types #Pridávame import tlačidiel
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token bota
user_id = 0 #id vášho účtu
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #kontrolujeme, či píše práve majiteľ
      comand = message.text  #text správy
      markup = types.InlineKeyboardMarkup() #vytvárame klávesnicu
      button = types.InlineKeyboardButton(text="Opakovať", callback_data=comand) #vytvárame tlačidlo
      markup.add(button) #pridávame tlačidlo do klávesnice
      try: #ak príkaz nie je vykonateľný - check_output vyhodí výnimku
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) #vyvolávame príkaz a posielame správu s výsledkom
      except:
         bot.send_message(user_id, "Neplatný vstup") #ak je príkaz nekorektný

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data #čítame príkaz z poľa tlačidla data
  try:#ak príkaz nie je vykonateľný - check_output vyhodí výnimku
     markup = types.InlineKeyboardMarkup() #vytvárame klávesnicu
     button = types.InlineKeyboardButton(text="Opakovať", callback_data=comand) #vytvárame tlačidlo a do data vkladáme príkaz
     markup.add(button) #pridávame tlačidlo do klávesnice
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #vyvolávame príkaz a posielame správu s výsledkom
  except:
     bot.send_message(user_id, "Neplatný vstup") #ak je príkaz nekorektný

if __name__ == '__main__':
    while True:
        try:#pridávame try na nepretržitú prevádzku
            bot.polling(none_stop=True)#spúšťame bota
        except:
            time.sleep(10)#v prípade pádu

Reštartujeme bota:

killall python3
screen -dmS ServerBot python3 bot.py

Znova skontrolujeme, či všetko funguje správne:

Přístup k linuxovému serveru pomocí Telegram bota na Pythonu

Po stlačení tlačidla pod správou by mal bot opakovať príkaz, ktorý bol poslaný v tejto správe.

Na záver

Samozrejme, tento spôsob nemôže nahradiť klasické metódy pripojenia, avšak umožňuje dosť rýchlo zistiť stav servera a poslať mu príkazy, ktoré nevyžadujú zložitý výstup.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster