Pristup linux serveru putem Telegram bota na Pythonu

Često se javljaju situacije kada je pristup serveru potreban odmah. Međutim, povezivanje putem SSH nije uvijek najprikladniji način, jer možda nemamo SSH klijenta, adresu servera ili korisničko ime/lozinku. Naravno, postoji Webmin, što pojednostavljuje administraciju, ali ne pruža trenutni pristup.

Stoga sam odlučio implementirati jednostavno, ali zanimljivo rešenje. Naime, napisati Telegram bota koji će, pokrećući se na samom serveru, izvršavati mu poslate komande i vraćati rezultate. Proučavajući nekoliko članaka o ovoj temi, shvatio sam da niko nije opisao slične implementacije.

Ovaj projekat sam realizovao na Ubuntu 16.04, ali da bi bez problema mogao da radi na drugim distribucijama, trudim se da sve bude opšte.

Registracija bota

Registrujemo novog bota kod @BotFather. Šaljemo mu /newbot i dalje po tekstu. Biće nam potrebni token novog bota i vaš id (možete ga dobiti, na primer, kod @userinfobot).

Priprema Python-a

Za pokretanje bota koristimo biblioteku telebot (pip install pytelegrambotapi). Pomoću biblioteke subprocess izvršićemo komande na serveru.

Pokretanje bota

Na serveru kreiramo datoteku bot.py:
nano bot.py

I umetnemo u nju kod:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token bota
user_id = 0 #id vašeg računa
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #proveravamo da li piše upravo vlasnik
      comand = message.text  #tekst poruke
      try: #ako je komanda neizvršna - check_output će izazvati izuzetak
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Nevalidan unos") #ako je komanda netačna
if __name__ == '__main__':
    while True:
        try:#dodajemo try za neprekidno funkcionisanje
            bot.polling(none_stop=True)#pokretanje bota
        except:
            time.sleep(10)#u slučaju pada

Zamenjujemo u njemu token bota onim koji je izdao @BotFather, i user_id — na vrednost id vašeg računa. Provera id korisnika je potrebna kako bi bot omogućavao pristup vašem serveru samo vama. Funkcija check_output() izvršava poslatu komandu i vraća rezultat.

Preostaje samo da pokrenemo bota. Za pokretanje procesa na serveru preferiram da koristim screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(gde je 'ServerBot' — identifikator procesa)

Proces će se automatski pokrenuti u pozadini. Pređimo na razgovor s botom i provjerimo radi li sve kako treba:

Pristup linux serveru putem Telegram bota na Pythonu

Čestitam! Bot izvršava poslane mu naredbe. Sada, kako biste dobili pristup serveru, dovoljno je otvoriti razgovor s botom.

Ponavljanje naredbi

Često je potrebno izvršavati iste naredbe za praćenje stanja servera. Stoga bi implementacija ponavljanja naredbi bez ponovnog slanja bila vrlo korisna.

Provodićemo pomoću inline tipki ispod poruka:

from subprocess import check_output
import telebot
from telebot import types #Dodajemo unos tipki
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token bota
user_id = 0 #id vašeg računa
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #provjeravamo da li piše upravo vlasnik
      comanda = message.text  #tekst poruke
      markup = types.InlineKeyboardMarkup() #kreiramo tipkovnicu
      button = types.InlineKeyboardButton(text="Ponoviti", callback_data=comanda) #kreiramo tipku
      markup.add(button) #dodajemo tipku u tipkovnicu
      try: #ako naredba nije izvediva - check_output će izbaciti iznimku
         bot.send_message(user_id, check_output(comanda, shell = True,  reply_markup = markup)) #izvode naredbu i šaljemo poruku s rezultatom
      except:
         bot.send_message(user_id, "Neispravan unos") #ako je naredba netočna

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comanda = call.data #čitamo naredbu iz polja tipke data
  try:#ako naredba nije izvediva - check_output će izbaciti iznimku
     markup = types.InlineKeyboardMarkup() #kreiramo tipkovnicu
     button = types.InlineKeyboardButton(text="Ponoviti", callback_data=comanda) #kreiramo tipku i u data šaljemo naredbu
     markup.add(button) #dodajemo tipku u tipkovnicu
     bot.send_message(user_id, check_output(comanda, shell = True), reply_markup = markup) #izvodimo naredbu i šaljemo poruku s rezultatom
  except:
     bot.send_message(user_id, "Neispravan unos") #ako je naredba netočna

if __name__ == '__main__':
    while True:
        try:#dodajemo try za neprekidno djelovanje
            bot.polling(none_stop=True)#pokrećemo bota
        except:
            time.sleep(10)#u slučaju pada

Ponovno pokrećemo bota:

killall python3
screen -dmS ServerBot python3 bot.py

Ponovno provjeravamo radi li sve ispravno:

Pristup linux serveru putem Telegram bota na Pythonu

Pri pritiskanju tipke ispod poruke bot bi trebao ponoviti naredbu na temelju koje je ta poruka poslana.

Umjesto zaključka

Naravno, ova metoda ne pretendira zamijeniti klasične načine povezivanja, međutim, omogućava relativno brzo saznanje o stanju servera i slanje mu naredbi koje ne zahtijevaju složeno ispisivanje.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster