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

Sehr oft gibt es Situationen, in denen hier und jetzt Zugriff auf den Server benötigt wird. Allerdings ist die Verbindung über SSH nicht immer die bequemste Möglichkeit, da Sie möglicherweise keinen SSH-Client, keine Serveradresse oder keine Benutzer-/Passwortkombination zur Hand haben. Natürlich gibt es Webmin, was die Verwaltung vereinfacht, aber auch keinen sofortigen Zugriff ermöglicht.

Deshalb habe ich beschlossen, eine einfache, aber interessante Lösung zu implementieren. Nämlich einen Telegram-Bot zu schreiben, der, wenn er auf dem Server selbst gestartet wird, die an ihn gesendeten Befehle ausführt und das Ergebnis zurückgibt. Studiert haben mehrere Artikel Zu diesem Thema wurde mir klar, dass noch niemand solche Implementierungen beschrieben hat.

Ich habe dieses Projekt auf Ubuntu 16.04 umgesetzt, aber für einen problemlosen Lauf auf anderen Distributionen habe ich versucht, alles allgemein zu gestalten.

Bot-Registrierung

Registrieren Sie einen neuen Bot bei @BotFather. Wir schicken ihn /newbot und weiter im Text. Wir benötigen einen neuen Bot-Token und Ihre ID (diese erhalten Sie beispielsweise bei @userinfobot).

Python-Vorbereitung

Um den Bot auszuführen, verwenden wir die Bibliothek telebot (pip install pytelegrambotapi). Nutzung der Bibliothek subprocess Wir werden Befehle auf dem Server ausführen.

Bot-Start

Erstellen Sie eine bot.py-Datei auf dem Server:
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 den darin enthaltenen Bot-Token durch den von @BotFather ausgestellten und user_id durch den ID-Wert Ihres Kontos. Die Überprüfung der Benutzer-ID ist erforderlich, damit der Bot nur Ihnen Zugriff auf Ihren Server gewährt. Funktion check_output() führt den angegebenen Befehl aus und gibt das Ergebnis zurück.

Es bleibt nur noch, den Bot zu starten. Zum Ausführen von Prozessen auf dem Server bevorzuge ich die Verwendung screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(wobei „ServerBot“ die Prozess-ID ist)

Der Vorgang wird automatisch im Hintergrund ausgeführt. Gehen wir zum Dialog mit dem Bot und prüfen, ob alles so funktioniert, wie es soll:

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

Glückwunsch! Der Bot führt die ihm zugesandten Befehle aus. Um nun auf den Server zuzugreifen, müssen Sie nur noch einen Dialog mit dem Bot öffnen.

Befehlswiederholung

Um den Status des Servers zu überwachen, müssen Sie häufig dieselben Befehle ausführen. Daher ist die Implementierung wiederholter Befehle ohne erneutes Senden sehr fehl am Platz.

Wir werden es mithilfe von 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)#в случае падения

Neustart des Bots:

killall python3
screen -dmS ServerBot python3 bot.py

Überprüfen wir noch einmal, ob alles richtig funktioniert:

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

Durch Drücken der Schaltfläche unter der Nachricht muss der Bot den Befehl wiederholen, von dem aus diese Nachricht gesendet wurde.

Statt einer Schlussfolgerung

Natürlich stellt diese Methode keinen Ersatz für die klassischen Verbindungsmethoden dar, ermöglicht es Ihnen jedoch, sich schnell über den Zustand des Servers zu informieren und Befehle an ihn zu senden, die keine komplexe Ausgabe erfordern.

Source: habr.com

Kommentar hinzufügen