Dostęp do serwera Linux za pomocą bota Telegram w Pythonie

Dość często zdarzają się sytuacje, kiedy dostęp do serwera jest potrzebny tu i teraz. Jednak połączenie przez SSH nie zawsze jest najwygodniejszym sposobem, ponieważ możesz nie mieć pod ręką klienta SSH, adresu serwera lub kombinacji użytkownika i hasła. Oczywiście, że mam Webmin, co upraszcza administrację, ale też nie zapewnia natychmiastowego dostępu.

Postanowiłem więc wdrożyć proste, ale ciekawe rozwiązanie. Mianowicie napisać bota Telegrama, który po uruchomieniu na samym serwerze wykona wysłane do niego polecenia i zwróci wynik. Studiowałem kilka artykuły w tym temacie zdałem sobie sprawę, że nikt jeszcze nie opisał takich wdrożeń.

Zaimplementowałem ten projekt na Ubuntu 16.04, ale dla bezproblemowego działania na innych dystrybucjach starałem się zrobić wszystko w sposób ogólny.

Rejestracja bota

Zarejestruj nowego bota w @BotFather. Wysyłamy go /newbot i dalej w tekście. Będziemy potrzebować nowego tokena bota oraz Twojego id (możesz go zdobyć np @userinfobot).

Przygotowanie Pythona

Do uruchomienia bota użyjemy biblioteki telebot (pip install pytelegrambotapi). Korzystanie z Biblioteki subprocess wykonamy polecenia na serwerze.

Uruchomienie bota

Utwórz plik bot.py na serwerze:
nano bot.py

I wklej do niego kod:

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

Zamieniamy w nim token bota na ten wystawiony przez @BotFather, a user_id na wartość id Twojego konta. Sprawdzenie identyfikatora użytkownika jest potrzebne, aby bot zapewniał dostęp do Twojego serwera tylko Tobie. Funkcjonować check_output() wykonuje podane polecenie i zwraca wynik.

Pozostaje tylko uruchomić bota. Do uruchamiania procesów na serwerze wolę używać screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(gdzie „ServerBot” to identyfikator procesu)

Proces zostanie automatycznie uruchomiony w tle. Przejdźmy do dialogu z botem i sprawdźmy, czy wszystko działa tak, jak powinno:

Dostęp do serwera Linux za pomocą bota Telegram w Pythonie

Gratulacje! Bot wykonuje wysyłane do niego polecenia. Teraz, aby uzyskać dostęp do serwera, wystarczy otworzyć dialog z botem.

Powtórzenie polecenia

Często, aby monitorować stan serwera, musisz wykonać te same polecenia. Dlatego realizacja powtarzających się poleceń bez ich ponownego wysyłania będzie bardzo nie na miejscu.

Zaimplementujemy to za pomocą wbudowanych przycisków pod komunikatami:

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

Restart bota:

killall python3
screen -dmS ServerBot python3 bot.py

Sprawdźmy jeszcze raz, czy wszystko działa poprawnie:

Dostęp do serwera Linux za pomocą bota Telegram w Pythonie

Naciskając przycisk pod wiadomością, bot musi powtórzyć polecenie, z którego ta wiadomość została wysłana.

Zamiast zawierania

Oczywiście ta metoda nie pretenduje do miana zamiennika klasycznych metod łączenia, jednak pozwala szybko dowiedzieć się o stanie serwera i wysłać do niego polecenia, które nie wymagają skomplikowanego wyjścia.

Źródło: www.habr.com

Dodaj komentarz