Zugriff auf den Linux-Server über einen Telegram-Bot in Python

Es kommen häufig Situationen vor, in denen der Zugriff auf den Server hier und jetzt erforderlich ist. Allerdings ist die Verbindung über SSH nicht immer der bequemste Weg, da möglicherweise kein SSH-Client, die Serveradresse oder die Kombination "Benutzername/Passwort" zur Hand ist. Natürlich gibt es Webmin, das die Administration erleichtert, aber auch keinen sofortigen Zugriff bietet.

Deshalb habe ich mich entschieden, eine einfache, aber interessante Lösung zu entwickeln. Nämlich einen Telegram-Bot zu schreiben, der beim Starten auf dem Server die ihm gesendeten Befehle ausführt und das Ergebnis zurückgibt. Nachdem ich mehrere Artikel zu diesem Thema recherchiert habe, wurde mir klar, dass niemand solche Implementierungen bisher beschrieben hat.

Dieses Projekt habe ich auf Ubuntu 16.04 umgesetzt, aber um einen problemlosen Start auf anderen Distributionen zu gewährleisten, habe ich versucht, alles allgemein zu halten.

Registrierung des Bots

Wir registrieren einen neuen Bot bei @BotFather. Wir senden ihm /newbot und so weiter. Wir benötigen das Token des neuen Bots und Ihre ID (die Sie zum Beispiel von @userinfobot).

erhalten können).

Vorbereitung von Python Für den Start des Bots verwenden wir die Bibliothek (telebotpip install pytelegrambotapi ). Mit der Bibliothek subprocess

führen wir Befehle auf dem Server aus.

Start des Bots
Auf dem Server erstellen wir die Datei bot.py:

nano bot.py

Und fügen den Code ein:

from subprocess import check_output import telebot import timebot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token des Bots user_id = 0 #ID Ihres Kontos @bot.message_handler(content_types=["text"]) def main(message): if (user_id == message.chat.id): #Überprüfung, dass wirklich der Eigentümer schreibt comand = message.text #Nachrichtentext try: #Wenn der Befehl nicht ausführbar ist, wird check_output eine Ausnahme auslösen bot.send_message(message.chat.id, check_output(comand, shell = True)) except: bot.send_message(message.chat.id, "Ungültige Eingabe") #Falls der Befehl inkorrekt ist if __name__ == '__main__': while True: try:#try-Block für unterbrechungsfreien Betrieb bot.polling(none_stop=True)#Start des Bots except: time.sleep(10)#Im Falle eines Absturzes Wir ersetzen das Token des Bots durch das, das @BotFather ausgegeben hat, und user_id durch den Wert der ID Ihres Kontos. Die Überprüfung der Benutzer-ID dient dazu, dass der Bot den Zugriff auf Ihren Server nur Ihnen gewährt. Die Funktion check_output()

führt den übergebenen Befehl aus und gibt das Ergebnis zurück. Nun bleibt nur noch, den Bot zu starten. Um Prozesse auf dem Server zu starten, benutze ich gerne (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(wo "ServerBot" die Prozess-ID ist)

Der Prozess startet automatisch im Hintergrund. Lass uns in den Dialog mit dem Bot gehen und überprüfen, ob alles wie geplant funktioniert:

Zugriff auf den Linux-Server über einen Telegram-Bot in Python

Herzlichen Glückwunsch! Der Bot führt die ihm gesendeten Befehle aus. Um Zugang zum Server zu erhalten, reicht es jetzt, den Dialog mit dem Bot zu öffnen.

Befehlswiederholung

Oftmals müssen dieselben Befehle zur Überwachung des Serverstatus ausgeführt werden. Daher wird die Implementierung einer Befehlswiederholung ohne erneute Sendung sehr nützlich sein.

Wir werden dies mit Inline-Buttons unter den Nachrichten umsetzen:

from subprocess import check_output
import telebot
from telebot import types #Fügen Sie den Import von Buttons hinzu
import time

bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Bot-Token
user_id = 0 #ID Ihres Kontos
@bot.message_handler(content_types=["text"])
def main(message):
   if (user_id == message.chat.id): #überprüfen, ob genau der Inhaber schreibt
      comand = message.text  #Text der Nachricht
      markup = types.InlineKeyboardMarkup() #Tastatur erstellen
      button = types.InlineKeyboardButton(text="Wiederholen", callback_data=comand) #Button erstellen
      markup.add(button) #Button zur Tastatur hinzufügen
      try: #wenn der Befehl nicht ausführbar ist - check_output löst eine Ausnahme aus
         bot.send_message(user_id, check_output(comand, shell = True,  reply_markup = markup)) #Befehl ausführen und Nachricht mit dem Ergebnis senden
      except:
         bot.send_message(user_id, "Ungültige Eingabe") #wenn der Befehl ungültig ist

@bot.callback_query_handler(func=lambda call: True)
def callback(call):
  comand = call.data #Befehl aus dem Button-Datenfeld lesen
  try:#wenn der Befehl nicht ausführbar ist - check_output löst eine Ausnahme aus
     markup = types.InlineKeyboardMarkup() #Tastatur erstellen
     button = types.InlineKeyboardButton(text="Wiederholen", callback_data=comand) #Button erstellen und den Befehl in data übergeben
     markup.add(button) #Button zur Tastatur hinzufügen
     bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #Befehl ausführen und Nachricht mit dem Ergebnis senden
  except:
     bot.send_message(user_id, "Ungültige Eingabe") #wenn der Befehl ungültig ist

if __name__ == '__main__':
    while True:
        try:#try für ununterbrochene Arbeit hinzufügen
            bot.polling(none_stop=True)#Bot starten
        except:
            time.sleep(10)#Im Falle eines Absturzes

Bot neu starten:

killall python3
screen -dmS ServerBot python3 bot.py

Lassen Sie uns erneut überprüfen, ob alles korrekt funktioniert:

Zugriff auf den Linux-Server über einen Telegram-Bot in Python

Beim Drücken des Buttons unter der Nachricht sollte der Bot den Befehl wiederholen, von dem diese Nachricht gesendet wurde.

Zum Abschluss

Natürlich erhebt diese Methode nicht den Anspruch, die klassischen Verbindungsmöglichkeiten zu ersetzen, jedoch ermöglicht sie es, schnell den Status des Servers zu erfahren und ihm Befehle zu senden, die keine komplizierte Ausgabe erfordern.

Quelle: habr.com

Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server 🔥 Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster