Toegang tot de linux-server via een Telegram-bot in Python

Het komt vaak voor dat je onmiddellijke toegang tot een server nodig hebt. Echter, SSH-verbinding is niet altijd de meest handige manier, omdat je mogelijk geen SSH-client, het serveradres of de combinatie 'gebruiker/wachtwoord' bij de hand hebt. Natuurlijk is er Webmin, wat het beheren vergemakkelijkt, maar het biedt ook geen directe toegang.

Daarom besloot ik een eenvoudige, maar interessante oplossing te implementeren. Namelijk, het schrijven van een Telegram-bot die, draaiende op de server, de ontvangen opdrachten uitvoert en de resultaten terugstuurt. Na het bestuderen van een aantal artikelen dit onderwerp, realiseerde ik me dat niemand soortgelijke implementaties had beschreven.

Dit project heb ik gerealiseerd op Ubuntu 16.04, maar om het probleemloos op andere distributies te laten draaien, heb ik geprobeerd alles algemeen te houden.

Bot registratie

We registreren een nieuwe bot bij @BotFather. Stuur hem /newbot en ga verder met de tekst. We hebben de token van de nieuwe bot en jouw id nodig (je kunt het bijvoorbeeld krijgen van @userinfobot).

Voorbereiding Python

We gaan de library gebruiken telebot (pip install pytelegrambotapi). Met behulp van de library subprocess gaan we opdrachten op de server uitvoeren.

Bot starten

Maak op de server een bestand aan met de naam bot.py:
nano bot.py

En plak de volgende code:

from subprocess import check_output
import telebot
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#bot token
user_id = 0 #id van jouw account
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #controleer of de eigenaar schrijft
      comand = message.text  #bericht tekst
      try: #als de opdracht niet uitgevoerd kan worden, geeft check_output een uitzondering
         bot.send_message(message.chat.id, check_output(comand, shell = True))
      except:
         bot.send_message(message.chat.id, "Ongeldige invoer") #als de opdracht ongeldig is
if __name__ == '__main__':
    while True:
        try:#voeg try toe voor ononderbroken werking
            bot.polling(none_stop=True)#start de bot
        except:
            time.sleep(10)#bij een crash

Vervang hierin de token van de bot door degene die @BotFather heeft gegeven en user_id door de id van jouw account. De controle van de gebruikers-id is nodig zodat de bot toegang tot jouw server alleen aan jou verleent. De functie check_output() voert de opgegeven opdracht uit en retourneert het resultaat.

Nu hoeven we alleen de bot nog te starten. Voor het starten van processen op de server gebruik ik het liefst screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(waarbij 'ServerBot' de procesidentificator is)

Het proces zal automatisch op de achtergrond worden gestart. Laten we in gesprek gaan met de bot en controleren of alles werkt zoals het hoort:

Toegang tot de linux-server via een Telegram-bot in Python

Gefeliciteerd! De bot voert de ontvangen commando's uit. Nu, om toegang tot de server te krijgen, hoeft u alleen maar het gesprek met de bot te openen.

Herhaling van commando's

Vaak is het nodig om dezelfde commando's uit te voeren om de status van de server te controleren. Daarom is de implementatie van het herhalen van commando's zonder ze opnieuw te verzenden zeer gewenst.

We zullen dit implementeren met inline-knoppen onder de berichten:

from subprocess import check_output
import telebot
from telebot import types #Voeg import van knoppen toe
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token van de bot
user_id = 0 #id van uw account
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #controleer of dit de eigenaar is
      comand = message.text  #tekst van het bericht
      markup = types.InlineKeyboardMarkup() #maak een toetsenbord
      button = types.InlineKeyboardButton(text="Herhalen", callback_data=comand) #maak een knop
      markup.add(button) #voeg de knop toe aan het toetsenbord
      try: #als het commando niet uitvoerbaar is - check_output zal een uitzondering geven
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) #roep het commando aan en stuur een bericht met het resultaat
      except:
         bot.send_message(user_id, "Ongeldige invoer") #als het commando ongeldig is

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data #lees het commando uit het knopdata-veld
  try:#als het commando niet uitvoerbaar is - check_output zal een uitzondering geven
     markup = types.InlineKeyboardMarkup() #maak een toetsenbord
     button = types.InlineKeyboardButton(text="Herhalen", callback_data=comand) #maak een knop en stuur het commando in data
     markup.add(button) #voeg de knop toe aan het toetsenbord
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #roep het commando aan en stuur een bericht met het resultaat
  except:
     bot.send_message(user_id, "Ongeldige invoer") #als het commando ongeldig is

if __name__ == '__main__':
    while True:
        try:#voeg try toe voor ononderbroken werking
            bot.polling(none_stop=True)#start de bot
        except:
            time.sleep(10)#bij een crash

Start de bot opnieuw op:

killall python3
screen -dmS ServerBot python3 bot.py

Laten we opnieuw controleren of alles correct werkt:

Toegang tot de linux-server via een Telegram-bot in Python

Wanneer u op de knop onder het bericht drukt, zou de bot het commando moeten herhalen waar dit bericht vandaan kwam.

Ter afsluiting

Zeker, deze methode pretendeert geen vervanging te zijn voor de klassieke verbindingstechnieken, maar het stelt ons in staat om snel de status van de server te leren en commando's te verzenden die geen complexe uitvoer vereisen.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster