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

Często zdarzają się sytuacje, w których dostęp do serwera jest potrzebny tu i teraz. Jednak nie zawsze połączenie przez SSH jest najdogodniejszym sposobem, ponieważ pod ręką może nie być klienta SSH, adresu serwera lub kombinacji „użytkownik/hasło”. Oczywiście, jest Webmin, który ułatwia administrację, ale również nie daje natychmiastowego dostępu.

Dlatego postanowiłem zrealizować proste, ale ciekawe rozwiązanie. Mianowicie – napisać bota Telegram, który uruchomiając się na samym serwerze, będzie wykonywał przysyłane mu polecenia i zwracał wyniki. Po przebadaniu serwerów, nie pozbędziesz się problemu "rozrostu" indeksów z czasem. Oczywiste jest, że jeśli możesz sobie pozwolić na codzienne wprowadzanie nowego serwera, to twoje problemy będą leżeć w zupełnie innej płaszczyźnie niż konkretna baza danych. artykułów tego tematu, zrozumiałem, że takie realizacje nie były dotąd opisane.

Ten projekt realizowałem na Ubuntu 16.04, ale aby umożliwić bezproblemowe uruchomienie na innych dystrybucjach, starałem się zrobić wszystko w ogólnej formie.

Rejestracja bota

Rejestrujemy nowego bota u @BotFather. Wysyłamy mu /newbot i dalej według tekstu. Będziemy potrzebować tokenu nowego bota oraz swojego id (można je uzyskać np. u @userinfobot).

Przygotowanie Pythona

Do uruchomienia bota użyjemy biblioteki telebot (pip install pytelegrambotapi). Za pomocą biblioteki subprocess będziemy wykonywać polecenia na serwerze.

Uruchomienie bota

Na serwerze tworzymy plik bot.py:
nano bot.py

I wklejamy do niego kod:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token bota
user_id = 0 #id twojego konta
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #sprawdzamy, czy pisze właściciel
      comand = message.text  #tekst wiadomości
      try: #jeśli polecenie nie jest wykonalne - check_output zgłosi wyjątek
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Nieprawidłowe dane wejściowe") #jeśli polecenie jest niepoprawne
if __name__ == '__main__':
    while True:
        try:#dodajemy try dla ciągłej pracy
            bot.polling(none_stop=True)#uruchomienie bota
        except:
            time.sleep(10)#w przypadku błędu

Zamieniamy w nim token bota na ten, który wydał @BotFather, a user_id — na wartość id twojego konta. Sprawdzenie id użytkownika jest potrzebne, aby bot udostępniał dostęp do twojego serwera tylko tobie. Funkcja check_output() wykonuje przekazane polecenie i zwraca wynik.

Pozostało 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 automatycznie uruchomi się w tle. Przejdźmy do rozmowy z botem i sprawdźmy, czy wszystko działa jak należy:

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

Gratulacje! Bot wykonuje przesyłane mu polecenia. Teraz, aby uzyskać dostęp do serwera, wystarczy otworzyć rozmowę z botem.

Powtarzanie poleceń

Często, aby monitorować stan serwera, trzeba wykonywać te same polecenia. Dlatego realizacja powtarzania poleceń bez ich ponownego wysyłania będzie bardzo przydatna.

Zrealizujemy to przy pomocy przycisków inline pod wiadomościami:

from subprocess import check_output
import telebot
from telebot import types # Dodajemy import przycisków
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") # Token bota
user_id = 0 # id twojego konta
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): # sprawdzamy, czy pisze właściciel
      comand = message.text  # tekst wiadomości
      markup = types.InlineKeyboardMarkup() # tworzymy klawiaturę
      button = types.InlineKeyboardButton(text="Powtórz", callback_data=comand) # tworzymy przycisk
      markup.add(button) # dodajemy przycisk do klawiatury
      try: # jeśli polecenie jest niewykonywalne - check_output zgłosi wyjątek
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) # wywołujemy polecenie i wysyłamy wiadomość z wynikiem
      except:
         bot.send_message(user_id, "Nieprawidłowe dane wejściowe") # jeśli polecenie jest niepoprawne

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data # odczytujemy polecenie z pola data przycisku
  try:# jeśli polecenie nie jest wykonywalne - check_output zgłosi wyjątek
     markup = types.InlineKeyboardMarkup() # tworzymy klawiaturę
     button = types.InlineKeyboardButton(text="Powtórz", callback_data=comand) # tworzymy przycisk i w data podajemy polecenie
     markup.add(button) # dodajemy przycisk do klawiatury
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) # wywołujemy polecenie i wysyłamy wiadomość z wynikiem
  except:
     bot.send_message(user_id, "Nieprawidłowe dane wejściowe") # jeśli polecenie jest niepoprawne

if __name__ == '__main__':
    while True:
        try:# dodajemy try dla nieprzerwanej pracy
            bot.polling(none_stop=True)# uruchamiamy bota
        except:
            time.sleep(10)# w przypadku awarii

Restartujemy bota:

killall python3
screen -dmS ServerBot python3 bot.py

Ponownie sprawdzimy, czy wszystko działa poprawnie:

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

Po naciśnięciu przycisku pod wiadomością bot powinien powtórzyć polecenie, od którego ta wiadomość została wysłana.

Zamiast zakończenia

Bez wątpienia, ta metoda nie ma na celu zastąpienia klasycznych sposobów łączenia, jednak umożliwia stosunkowo szybkie uzyskanie informacji o stanie serwera i wysłanie mu poleceń, które nie wymagają skomplikowanego wyjścia.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster