Es gibt häufig Situationen, in denen der Zugang zum Server sofort benötigt wird. Allerdings ist die SSH-Verbindung nicht immer der bequemste Weg, da möglicherweise kein SSH-Client, die Serveradresse oder die Kombination „Benutzer/Passwort“ zur Hand ist. Natürlich gibt es , das die Verwaltung erleichtert, aber es bietet keinen sofortigen Zugang.
Deshalb habe ich mich entschieden, eine einfache, aber interessante Lösung zu entwickeln. Genauer gesagt – ich wollte einen Telegram-Bot schreiben, der, gestartet auf dem Server, empfangene Befehle ausführt und die Ergebnisse zurückmeldet. Nachdem ich darüber gelesen habe, wurde mir klar, dass bisher niemand solche Umsetzungen beschrieben hat.
Dieses Projekt habe ich auf Ubuntu 16.04 realisiert, aber um einen reibungslosen Betrieb auf anderen Distributionen zu gewährleisten, habe ich versucht, alles allgemein zu halten.
Registrierung des Bots
Wir registrieren einen neuen Bot über @BotFather. Wir senden ihm /newbot und so weiter. Wir benötigen das Token des neuen Bots und Ihre ID (diese kann man beispielsweise bei ).
erhalten).
Vorbereitung von Python Für den Betrieb des Bots verwenden wir die Bibliothek (telebotpip install pytelegrambotapi ). Mit der Bibliothek subprocess
werden wir Befehle auf dem Server ausführen.
Erstellen Sie die Datei bot.py auf dem Server:
nano bot.py
Fügen Sie den Code ein:
from subprocess import check_output
import telebot
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 der Verfasser der Eigentümer ist
comand = message.text # Text der Nachricht
try: # wenn der Befehl nicht ausführbar ist, gibt check_output eine Ausnahme aus
bot.send_message(message.chat.id, check_output(comand, shell=True))
except:
bot.send_message(message.chat.id, "Ungültige Eingabe") # wenn der Befehl nicht korrekt ist
if __name__ == '__main__':
while True:
try: # fügen Sie try für einen stabilen Betrieb hinzu
bot.polling(none_stop=True) # Bot starten
except:
time.sleep(10) # bei einem Absturz
Ersetzen Sie darin den Bot-Token durch den von @BotFather bereitgestellten und user_id durch die ID Ihres Kontos. Die Überprüfung der Benutzer-ID ist notwendig, damit der Bot nur Ihnen Zugriff auf Ihren Server gewährt. Funktion check_output() führt den übergebenen Befehl aus und gibt das Ergebnis zurück.
Sie müssen nur den Bot starten. Um Prozesse auf dem Server zu starten, bevorzuge ich screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(wobei „ServerBot“ die Prozess-ID ist)
Der Prozess wird automatisch im Hintergrund gestartet. Lassen Sie uns in den Dialog mit dem Bot wechseln und überprüfen, ob alles wie gewünscht funktioniert:

Herzlichen Glückwunsch! Der Bot führt die ihm gesendeten Befehle aus. Um Zugang zum Server zu erhalten, müssen Sie lediglich den Dialog mit dem Bot öffnen.
Befehlswiederholung
Oftmals müssen dieselben Befehle zur Überwachung des Serverstatus ausgeführt werden. Daher wird die Implementierung einer Befehlswiederholung ohne erneute Eingabe sehr nützlich sein.
Wir werden dies mithilfe von Inline-Buttons unter den Nachrichten implementieren:
from subprocess import check_output
import telebot
from telebot import types # Fügen Sie den Import von Schaltflächen hinzu
import time
bot = 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üfen, dass der Besitzer schreibt
comand = message.text # Text der Nachricht
markup = types.InlineKeyboardMarkup() # Erstellen der Tastatur
button = types.InlineKeyboardButton(text="Wiederholen", callback_data=comand) # Erstellen der Schaltfläche
markup.add(button) # Hinzufügen der Schaltfläche zur Tastatur
try: # Wenn der Befehl nicht ausführbar ist - check_output wirft eine Ausnahme
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) # Befehl ausführen und Ergebnisnachricht 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 Schaltflächenfeld lesen
try: # Wenn der Befehl nicht ausführbar ist - check_output wirft eine Ausnahme
markup = types.InlineKeyboardMarkup() # Erstellen der Tastatur
button = types.InlineKeyboardButton(text="Wiederholen", callback_data=comand) # Erstellen der Schaltfläche und Befehl zur data hinzufügen
markup.add(button) # Hinzufügen der Schaltfläche zur Tastatur
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) # Befehl ausführen und Ergebnisnachricht senden
except:
bot.send_message(user_id, "Ungültige Eingabe") # Wenn der Befehl ungültig ist
if __name__ == '__main__':
while True:
try: # Try hinzufügen für unterbrechungsfreien Betrieb
bot.polling(none_stop=True) # Bot starten
except:
time.sleep(10) # Bei Absturz
Neustart des Bots:
killall python3
screen -dmS ServerBot python3 bot.py
Lassen Sie uns überprüfen, ob alles korrekt funktioniert:

Durch Drücken der Taste unter der Nachricht sollte der Bot den Befehl wiederholen, von dem diese Nachricht gesendet wurde.
Abschließend
Zweifellos stellt diese Methode keinen Ersatz für die klassischen Verbindungsmethoden dar, ermöglicht jedoch eine schnelle Abfrage des Serverstatus und das Senden einfacher Befehle ohne komplexe Ausgaben.
Quelle: habr.com
