Zugriff auf den Linux-Server mit dem Python Telegram-Bot

Sehr oft gibt es Situationen, in denen hier und jetzt Zugriff auf den Server erforderlich ist. Eine SSH-Verbindung ist jedoch nicht immer der bequemste Weg, da der SSH-Client, die Serveradresse oder die Benutzer- / Kennwortverbindung möglicherweise nicht verfügbar sind. Natürlich gibt es Webmin , das die Verwaltung vereinfacht, aber auch keinen sofortigen Zugriff bietet.

Also habe ich beschlossen, eine einfache, aber interessante Lösung zu implementieren. Um nämlich einen Telegramm-Bot zu schreiben, der, beginnend auf dem Server selbst, die an ihn gesendeten Befehle ausführt und das Ergebnis zurückgibt. Nachdem ich mehrere Artikel zu diesem Thema studiert hatte, stellte ich fest, dass noch niemand solche Implementierungen beschrieben hat.

Ich habe dieses Projekt unter Ubuntu 16.04 implementiert, aber für einen problemlosen Start auf anderen Distributionen habe ich versucht, alles allgemein zu machen.

Bot Registrierung


Registrieren Sie einen neuen Bot bei @BotFather. Wir senden ihm /newbot und weiter im Text. Wir benötigen das Token des neuen Bots und Ihre ID (Sie können es beispielsweise von @userinfobot erhalten ).

Python-Vorbereitung


Um den Bot zu starten, verwenden wir die telebot Bibliothek ( pip install pytelegrambotapi ). Unter Verwendung der subprocess wir Befehle auf dem Server aus.

Bot-Start


Erstellen Sie auf dem Server die Datei bot.py:
nano bot.py

Und fügen Sie den Code ein:

 from subprocess import check_output import telebot import time bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#  user_id = 0 #id   @bot.message_handler(content_types=["text"]) def main(message): if (user_id == message.chat.id): #,     comand = message.text #  try: #   - check_output  exception bot.send_message(message.chat.id, check_output(comand, shell = True)) except: bot.send_message(message.chat.id, "Invalid input") #   if __name__ == '__main__': while True: try:# try    bot.polling(none_stop=True)#  except: time.sleep(10)#   

Wir ersetzen das darin enthaltene Bot-Token durch das von @BotFather ausgegebene und user_id durch den ID-Wert Ihres Kontos. Das Überprüfen der Benutzer-ID ist erforderlich, damit der Bot nur Ihnen Zugriff auf Ihren Server gewährt. Die Funktion check_output() führt den übergebenen Befehl aus und gibt das Ergebnis zurück.

Es bleibt nur der Bot zu starten. Um Prozesse auf dem Server zu starten, bevorzuge ich den screen ( sudo apt-get install screen ):

 screen -dmS ServerBot python3 bot.py 
(wobei "ServerBot" die Prozesskennung ist)

Der Prozess startet automatisch im Hintergrund. Gehen wir in den Dialog mit dem Bot und überprüfen, ob alles so funktioniert, wie es sollte:



Glückwunsch! Der Bot führt die an ihn gesendeten Befehle aus. Um nun Zugriff auf den Server zu erhalten, müssen Sie nur noch einen Dialog mit dem Bot öffnen.

Wiederholung von Befehlen


Um den Status des Servers zu überwachen, müssen Sie häufig dieselben Befehle ausführen. Daher ist die Implementierung der Wiederholung von Befehlen, ohne sie erneut zu senden, sehr unangebracht.

Wir werden mithilfe der Inline-Schaltflächen unter den Nachrichten implementieren:

 from subprocess import check_output import telebot from telebot import types #   import time bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#  user_id = 0 #id   @bot.message_handler(content_types=["text"]) def main(message): if (user_id == message.chat.id): #,     comand = message.text #  markup = types.InlineKeyboardMarkup() #  button = types.InlineKeyboardButton(text="", callback_data=comand) #  markup.add(button) #    try: #   - check_output  exception bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) #       except: bot.send_message(user_id, "Invalid input") #   @bot.callback_query_handler(func=lambda call: True) def callback(call): comand = call.data #     data try:#    - check_output  exception markup = types.InlineKeyboardMarkup() #  button = types.InlineKeyboardButton(text="", callback_data=comand) #    data   markup.add(button) #    bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #       except: bot.send_message(user_id, "Invalid input") #   if __name__ == '__main__': while True: try:# try    bot.polling(none_stop=True)#  except: time.sleep(10)#   

Starten Sie den Bot neu:

 killall python3 screen -dmS ServerBot python3 bot.py 

Überprüfen Sie erneut, ob alles korrekt funktioniert:



Durch Drücken der Taste unter der Nachricht sollte der Bot den Befehl wiederholen, von dem die Nachricht gesendet wurde.

Anstelle einer Schlussfolgerung


Natürlich gibt diese Methode nicht vor, die klassischen Verbindungsmethoden zu ersetzen. Sie ermöglicht es Ihnen jedoch, schnell den Status des Servers zu ermitteln und ihm Befehle zu senden, die keine komplexe Ausgabe erfordern.

Source: https://habr.com/ru/post/de443846/


All Articles