Dostop do linux strežnika s pomočjo Telegram bota v Pythonu

Pogosto se zgodijo situacije, ko je dostop do strežnika potreben takoj. Vendar pa povezava prek SSH ni vedno najbolj priročen način, saj morda ne bo na voljo SSH odjemalca, naslova strežnika ali kombinacije "uporabnik/pasword". Seveda, obstaja Webmin, ki poenostavi upravljanje, vendar pa tudi ne omogoča takojšnjega dostopa.

Zato sem se odločil, da uresničim preprosto, a zanimivo rešitev. Napisal sem Telegram bota, ki, začenši na strežniku, izvaja ukaze, ki mu jih pošljemo, in vrača rezultate. Po pregledu nekaterih članov na to temo, sem ugotovil, da takšnih implementacij še nihče ni opisal.

Ta projekt sem izvajal na Ubuntu 16.04, vendar sem poskušal vse narediti v splošni obliki, da bo brez težav delovalo na drugih distribucijah.

Registracija bota

Registriramo novega bota pri @BotFather. Pošljemo mu /newbot nadaljujemo po besedilu. Potrebovali bomo token novega bota in vaš id (dobite ga lahko, na primer, pri @userinfobot).

Priprava Pythona

Za zagon bota bomo uporabljali knjižnico telebot (pip install pytelegrambotapi). S knjižnico subprocess bomo izvajali ukaze na strežniku.

Zagon bota

Na strežniku ustvarimo datoteko bot.py:
nano bot.py

In vanjo prilepimo kodo:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token bota
user_id = 0 #id vašega računa
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #preverimo, ali piše prav lastnik
      komand = message.text  #besedilo sporočila
      try: #če uka ni mogoče izvesti - check_output obiskal bo izjemo
         bot.send_message(message.chat.id, check_output(komand, shell = True))
      except:
         bot.send_message(message.chat.id, "Neveljaven vnos") #če je ukaz napačen
if __name__ == '__main__':
    while True:
        try:#dodajamo try za nemoteno delovanje
            bot.polling(none_stop=True)#zagon bota
        except:
            time.sleep(10)#v primeru padca

Zamenjamo token bota s tistim, ki ga je izdal @BotFather, in user_id z vrednostjo id vašega računa. Preverjanje id uporabnika je potrebno, da bot omogoča dostop do vašega strežnika le vam. Funkcija check_output() izvrši posredovan ukaz in vrne rezultat.

Ostalo je le še zagnati bota. Za zagon procesov na strežniku raje uporabljam screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kjer je "ServerBot" identifikator procesa)

Postopek se bo samodejno zagnal v ozadju. Poglejmo z botom in preverimo, ali vse deluje, kot je treba:

Dostop do linux strežnika s pomočjo Telegram bota v Pythonu

Čestitamo! Bot izvaja ukaze, ki jih prejme. Zdaj, da pridobite dostop do strežnika, je dovolj, da odprete dialog z botom.

Ponovitev ukazov

Pogosto je potrebno za spremljanje stanja strežnika izvajati iste ukaze. Zato bo zelo koristna implementacija ponavljanja ukazov brez ponovnega pošiljanja.

Izvajali bomo s pomočjo inline gumbov pod sporočili:

from subprocess import check_output
import telebot
from telebot import types #Dodajamo uvoz gumbov
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token bota
user_id = 0 #id vašega računa
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #preverimo, da piše lastnik
      comand = message.text  #besedilo sporočila
      markup = types.InlineKeyboardMarkup() #ustvarimo tipkovnico
      button = types.InlineKeyboardButton(text="Ponovi", callback_data=comand) #ustvarimo gumb
      markup.add(button) #dodamo gumb v tipkovnico
      try: #če ukaz ni izvedljiv, bo check_output vrnil izjemo
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) #izvedemo ukaz in pošljemo sporočilo z rezultatom
      except:
         bot.send_message(user_id, "Neveljavna vnos") #če je ukaz nepravilen

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data #preberemo ukaz iz polja gumb data
  try:#če ukaz ni izvedljiv, bo check_output vrnil izjemo
     markup = types.InlineKeyboardMarkup() #ustvarimo tipkovnico
     button = types.InlineKeyboardButton(text="Ponovi", callback_data=comand) #ustvarimo gumb in v data posredujemo ukaz
     markup.add(button) #dodamo gumb v tipkovnico
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #izvedemo ukaz in pošljemo sporočilo z rezultatom
  except:
     bot.send_message(user_id, "Neveljavna vnos") #če je ukaz nepravilen

if __name__ == '__main__':
    while True:
        try:#dodamo poskus za nemoteno delovanje
            bot.polling(none_stop=True)#zaženemo bota
        except:
            time.sleep(10)#v primeru izpada

Ponovno zagnamo bota:

killall python3
screen -dmS ServerBot python3 bot.py

Še enkrat preverimo, ali vse deluje pravilno:

Dostop do linux strežnika s pomočjo Telegram bota v Pythonu

Ob pritisku na gumb pod sporočilom mora bot ponoviti ukaz, zaradi katerega je bilo to sporočilo poslano.

Namesto zaključka

Seveda, ta metoda ne more nadomestiti klasičnih načinov povezave, vendar omogoča precej hitro pridobitev informacij o stanju strežnika ter pošiljanje ukazov, ki ne zahtevajo zapletenega izhoda.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster