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

Poměrně často nastávají situace, kdy je potřeba přístup na server tady a teď. Připojení přes SSH však není vždy nejpohodlnější způsob, protože nemusíte mít po ruce SSH klienta, adresu serveru nebo kombinaci uživatele a hesla. Samozřejmě že ano Webmin, což zjednodušuje administraci, ale také neposkytuje okamžitý přístup.

Rozhodl jsem se tedy implementovat jednoduché, ale zajímavé řešení. Konkrétně napsat telegramového robota, který po spuštění na samotném serveru provede příkazy, které mu byly zaslány, a vrátí výsledek. Po studiu někteří články na toto téma jsem si uvědomil, že takové implementace ještě nikdo nepopsal.

Tento projekt jsem implementoval na Ubuntu 16.04, ale pro bezproblémový chod na jiných distribucích jsem se snažil vše udělat obecně.

Registrace bota

Zaregistrujte nového robota u @BotFather. Posíláme ho /newbot a dále v textu. Budeme potřebovat nový token bota a vaše ID (můžete ho získat např @userinfobot).

Příprava Pythonu

Ke spuštění robota použijeme knihovnu telebot (pip install pytelegrambotapi). Používání knihovny subprocess budeme provádět příkazy na serveru.

Spuštění robota

Vytvořte soubor bot.py na serveru:
nano bot.py

A vložte do něj kód:

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

Token bota v něm nahradíme tokenem vydaným @BotFather a user_id hodnotou id vašeho účtu. Kontrola ID uživatele je nutná, aby bot poskytoval přístup k vašemu serveru pouze vám. Funkce check_output() provede daný příkaz a vrátí výsledek.

Zbývá pouze spustit robota. Pro běh procesů na serveru preferuji použití screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kde "ServerBot" je ID procesu)

Proces bude automaticky spuštěn na pozadí. Pojďme k dialogu s robotem a zkontrolujte, zda vše funguje, jak má:

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

Gratulujeme! Robot provádí příkazy, které mu byly zaslány. Nyní, abyste se dostali na server, stačí otevřít dialog s robotem.

Opakování příkazu

Chcete-li sledovat stav serveru, musíte často provádět stejné příkazy. Proto bude implementace opakujících se příkazů bez jejich opětovného odeslání velmi nemístné.

Implementujeme to pomocí inline tlačítek pod zprávami:

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

Restartování robota:

killall python3
screen -dmS ServerBot python3 bot.py

Znovu zkontrolujte, zda vše funguje správně:

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

Stisknutím tlačítka pod zprávou musí bot zopakovat příkaz, ze kterého byla tato zpráva odeslána.

Místo závěru

Tento způsob se samozřejmě netváří jako náhrada za klasické způsoby připojení, nicméně umožňuje rychle zjistit stav serveru a odesílat na něj příkazy, které nevyžadují složitý výstup.

Zdroj: www.habr.com

Přidat komentář