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 , 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 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 ).
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:

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:

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
