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

Poměrně často nastávají situace, kdy je potřeba mít přístup k serveru okamžitě. Nicméně, připojení přes SSH nemusí být vždy nejpohodlnější způsob, protože nemusí být po ruce SSH klient, adresa serveru nebo kombinace „uživatel/hES kod“. Samozřejmě existuje Webmin, který usnadňuje správu, ale také neposkytuje okamžitý přístup.

Proto jsem se rozhodl realizovat jednoduché, ale zajímavé řešení. A to napsat Telegram bota, který, spuštěný na samotném serveru, bude vykonávat příkazy, které mu pošlete, a vracet výsledky. Po prostudování několik článků této problematiky jsem zjistil, že podobné realizace ještě nikdo nepopisoval.

Tento projekt jsem realizoval na Ubuntu 16.04, ale pro bezproblémové spuštění na jiných distribucích jsem se snažil udělat všeobecně.

Registrace bota

Zaregistrujeme nového bota u @BotFather. Pošleme mu /newbot a dále podle textu. Budeme potřebovat token nového bota a vaše id (můžete získat například u @userinfobot).

Příprava Pythonu

Pro spuštění bota použijeme knihovnu telebot (pip install pytelegrambotapi). S pomocí knihovny subprocess budeme vykonávat příkazy na serveru.

Spuštění bota

Na serveru vytvoříme soubor bot.py:
nano bot.py

A vložíme do něj kód:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token bota
user_id = 0 #id vašeho účtu
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #ověřujeme, že píše opravdu majitel
      comand = message.text  #text zprávy
      try: #pokud je příkaz neproveditelný - check_output vyvolá výjimku
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Neplatný vstup") #pokud je příkaz nesprávný
if __name__ == '__main__':
    while True:
        try:#přidáváme try pro bezproblémový provoz
            bot.polling(none_stop=True)#spuštění bota
        except:
            time.sleep(10)#v případě pádu

Změníme v něm token bota na ten, který poskytl @BotFather, a user_id na hodnotu id vašeho účtu. Ověření id uživatele je nutné, aby bot poskytoval přístup k vašemu serveru pouze vám. Funkce check_output() provádí předaný příkaz a vrací výsledek.

Zbývá jen spustit bota. Pro spuštění procesů na serveru preferuji použít screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kde „ServerBot“ je identifikátor procesu)

Proces se automaticky spustí na pozadí. Přesuneme se do dialogu s botem a zkontrolujeme, že vše funguje, jak má:

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

Gratulujeme! Bot vykonává zaslané mu příkazy. Nyní, abyste získali přístup k serveru, stačí otevřít dialog s botem.

Opakování příkazů

Často je třeba pro monitorování stavu serveru provádět stále stejné příkazy. Proto bude implementace opakování příkazů bez jejich znovu odeslání velmi užitečná.

Realizujeme pomocí inline tlačítek pod zprávami:

from subprocess import check_output
import telebot
from telebot import types #Přidáme import tlačítek
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token bota
user_id = 0 #id vašeho účtu
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #kontrola, že píše opravdu majitel
      comand = message.text  #text zprávy
      markup = types.InlineKeyboardMarkup() #vytvoření klávesnice
      button = types.InlineKeyboardButton(text="Opakovat", callback_data=comand) #vytvoření tlačítka
      markup.add(button) #přidání tlačítka do klávesnice
      try: #pokud příkaz není proveditelný - check_output vrátí výjimku
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) #vyvolání příkazu a odeslání zprávy s výsledkem
      except:
         bot.send_message(user_id, "Neplatný vstup") #pokud je příkaz neplatný

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data #načtení příkazu z pole tlačítka data
  try:#pokud příkaz není proveditelný - check_output vrátí výjimku
     markup = types.InlineKeyboardMarkup() #vytvoření klávesnice
     button = types.InlineKeyboardButton(text="Opakovat", callback_data=comand) #vytvoření tlačítka a do data předání příkazu
     markup.add(button) #přidání tlačítka do klávesnice
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #vyvolání příkazu a odeslání zprávy s výsledkem
  except:
     bot.send_message(user_id, "Neplatný vstup") #pokud je příkaz neplatný

if __name__ == '__main__':
    while True:
        try:#přidání try pro nepřerušovanou činnost
            bot.polling(none_stop=True)#spuštění bota
        except:
            time.sleep(10)#v případě pádu

Znovu spouštíme bota:

killall python3
screen -dmS ServerBot python3 bot.py

Znovu ověříme, že vše funguje správně:

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

Po stisknutí tlačítka pod zprávou by měl bot opakovat příkaz, ze kterého byla tato zpráva zaslána.

Na závěr

Bezpochyby, tato metoda se nemůže stát náhradou klasických způsobů připojení, ale dovoluje rychle zjistit stav serveru a zasílat mu příkazy, které nevyžadují složitý výstup.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster