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
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
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
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:
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:
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