Adgang til linux-server via en Telegram-bot i Python

Der sker ofte situationer, hvor adgang til serveren er nødvendig her og nu. Men forbindelsen via SSH er ikke altid den mest bekvemme metode, fordi man måske ikke har en SSH-klient, serverens adresse eller en kombination af "bruger/erhverv". Selvfølgelig er der Webmin, som forenkler administrationen, men det giver heller ikke øjeblikkelig adgang.

Derfor besluttede jeg at implementere en simpel, men interessant løsning. Nemlig at skrive en Telegram-bot, der, når den kører på serveren, vil udføre de kommandoer, den modtager, og returnere resultatet. Efter at have undersøgt flere artikler emner om dette, indså jeg, at ingen tidligere havde beskrevet lignende implementeringer.

Dette projekt implementerede jeg på Ubuntu 16.04, men for at sikre problemfri drift på andre distributioner har jeg forsøgt at gøre alt i en generel form.

Registrering af bot

Vi registrerer en ny bot hos @BotFather. Vi sender ham /newbot og så videre. Vi har brug for tokenet fra den nye bot og dit id (du kan få det fra for eksempel @userinfobot).

Forberedelse af Python

Til at starte bot'en vil vi bruge biblioteket telebot (pip install pytelegrambotapi). Ved hjælp af biblioteket subprocess vil vi udføre kommandoer på serveren.

Start af bot

Vi opretter en fil på serveren kaldet bot.py:
nano bot.py

Og indsætter koden:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#bot token
user_id = 0 #id på din konto
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #tjekker, at det er ejeren, der skriver
      comand = message.text  #tekst af beskeden
      try: #hvis kommandoen ikke kan udføres, vil check_output kaste en undtagelse
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Ugyldigt input") #hvis kommandoen er forkert
if __name__ == '__main__':
    while True:
        try:#tilføjer try for uafbrudt drift
            bot.polling(none_stop=True)#starter bot'en
        except:
            time.sleep(10)#hvis der opstår nedbrud

Erstat teksttokenet med det, der blev givet af @BotFather, og user_id med værdien af din kontos id. Tjek af id på brugeren er nødvendigt, så bot'en kun giver dig adgang til din server. Funktionen check_output() udfører den modtagne kommando og returnerer resultatet.

Det er kun tilbage at starte bot'en. For at starte processer på serveren foretrækker jeg at bruge screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(hvor "ServerBot" er proces-ID'en)

Processen vil automatisk starte i baggrunden. Lad os gå ind i dialogen med botten og tjekke, at alt fungerer, som det skal:

Adgang til linux-server via en Telegram-bot i Python

Tillykke! Botten udfører de kommandoer, den modtager. Nu, for at få adgang til serveren, er det nok at åbne dialogen med botten.

Gentagelse af kommandoer

Ofte kræver overvågning af serverens tilstand, at man udfører de samme kommandoer igen og igen. Derfor vil implementeringen af kommandoer uden at skulle sende dem igen være meget nyttig.

Vi vil implementere dette ved hjælp af inline-knapper under beskederne:

from subprocess import check_output
import telebot
from telebot import types # Tilføjer import af knapper
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")# Bot-token
user_id = 0 # id på din konto
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): # tjekker, om det er ejeren, der skriver
      comand = message.text  # beskedens tekst
      markup = types.InlineKeyboardMarkup() # laver tastaturet
      button = types.InlineKeyboardButton(text="Gentag", callback_data=comand) # laver knappen
      markup.add(button) # tilføjer knappen til tastaturet
      try: # hvis kommandoen ikke kan udføres, vil check_output give en exception
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) # kalder kommandoen og sender besked med resultatet
      except:
         bot.send_message(user_id, "Ugyldig input") # hvis kommandoen er forkert

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data # læser kommandoen fra knapdatafeltet
  try: # hvis kommandoen ikke kan udføres, vil check_output give en exception
     markup = types.InlineKeyboardMarkup() # laver tastaturet
     button = types.InlineKeyboardButton(text="Gentag", callback_data=comand) # laver knappen og sender kommandoen i data
     markup.add(button) # tilføjer knappen til tastaturet
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) # kalder kommandoen og sender besked med resultatet
  except:
     bot.send_message(user_id, "Ugyldig input") # hvis kommandoen er forkert

if __name__ == '__main__':
    while True:
        try: # tilføjer try for uafbrudt drift
            bot.polling(none_stop=True) # starter botten
        except:
            time.sleep(10) # ved nedbrud

Genstarter botten:

killall python3
screen -dmS ServerBot python3 bot.py

Lad os tjekke, at alt fungerer korrekt:

Adgang til linux-server via en Telegram-bot i Python

Når knappen under beskeden trykkes, skal botten gentage den kommando, som denne besked blev sendt fra.

Afslutning

Selvfølgelig kan denne metode ikke erstatte klassiske forbindelsesmetoder, men den giver mulighed for hurtigt at få information om serverens tilstand og sende den kommandoer, der ikke kræver komplekse udskrifter.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster