Het komt vaak voor dat je onmiddellijke toegang tot een server nodig hebt. Echter, SSH-verbinding is niet altijd de meest handige manier, omdat je mogelijk geen SSH-client, het serveradres of de combinatie 'gebruiker/wachtwoord' bij de hand hebt. Natuurlijk is er , wat het beheren vergemakkelijkt, maar het biedt ook geen directe toegang.
Daarom besloot ik een eenvoudige, maar interessante oplossing te implementeren. Namelijk, het schrijven van een Telegram-bot die, draaiende op de server, de ontvangen opdrachten uitvoert en de resultaten terugstuurt. Na het bestuderen van dit onderwerp, realiseerde ik me dat niemand soortgelijke implementaties had beschreven.
Dit project heb ik gerealiseerd op Ubuntu 16.04, maar om het probleemloos op andere distributies te laten draaien, heb ik geprobeerd alles algemeen te houden.
Bot registratie
We registreren een nieuwe bot bij @BotFather. Stuur hem /newbot en ga verder met de tekst. We hebben de token van de nieuwe bot en jouw id nodig (je kunt het bijvoorbeeld krijgen van ).
Voorbereiding Python
We gaan de library gebruiken telebot (pip install pytelegrambotapi). Met behulp van de library subprocess gaan we opdrachten op de server uitvoeren.
Bot starten
Maak op de server een bestand aan met de naam bot.py:
nano bot.py
En plak de volgende code:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#bot token
user_id = 0 #id van jouw account
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #controleer of de eigenaar schrijft
comand = message.text #bericht tekst
try: #als de opdracht niet uitgevoerd kan worden, geeft check_output een uitzondering
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Ongeldige invoer") #als de opdracht ongeldig is
if __name__ == '__main__':
while True:
try:#voeg try toe voor ononderbroken werking
bot.polling(none_stop=True)#start de bot
except:
time.sleep(10)#bij een crash
Vervang hierin de token van de bot door degene die @BotFather heeft gegeven en user_id door de id van jouw account. De controle van de gebruikers-id is nodig zodat de bot toegang tot jouw server alleen aan jou verleent. De functie check_output() voert de opgegeven opdracht uit en retourneert het resultaat.
Nu hoeven we alleen de bot nog te starten. Voor het starten van processen op de server gebruik ik het liefst screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(waarbij 'ServerBot' de procesidentificator is)
Het proces zal automatisch op de achtergrond worden gestart. Laten we in gesprek gaan met de bot en controleren of alles werkt zoals het hoort:

Gefeliciteerd! De bot voert de ontvangen commando's uit. Nu, om toegang tot de server te krijgen, hoeft u alleen maar het gesprek met de bot te openen.
Herhaling van commando's
Vaak is het nodig om dezelfde commando's uit te voeren om de status van de server te controleren. Daarom is de implementatie van het herhalen van commando's zonder ze opnieuw te verzenden zeer gewenst.
We zullen dit implementeren met inline-knoppen onder de berichten:
from subprocess import check_output
import telebot
from telebot import types #Voeg import van knoppen toe
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token van de bot
user_id = 0 #id van uw account
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #controleer of dit de eigenaar is
comand = message.text #tekst van het bericht
markup = types.InlineKeyboardMarkup() #maak een toetsenbord
button = types.InlineKeyboardButton(text="Herhalen", callback_data=comand) #maak een knop
markup.add(button) #voeg de knop toe aan het toetsenbord
try: #als het commando niet uitvoerbaar is - check_output zal een uitzondering geven
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) #roep het commando aan en stuur een bericht met het resultaat
except:
bot.send_message(user_id, "Ongeldige invoer") #als het commando ongeldig is
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data #lees het commando uit het knopdata-veld
try:#als het commando niet uitvoerbaar is - check_output zal een uitzondering geven
markup = types.InlineKeyboardMarkup() #maak een toetsenbord
button = types.InlineKeyboardButton(text="Herhalen", callback_data=comand) #maak een knop en stuur het commando in data
markup.add(button) #voeg de knop toe aan het toetsenbord
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #roep het commando aan en stuur een bericht met het resultaat
except:
bot.send_message(user_id, "Ongeldige invoer") #als het commando ongeldig is
if __name__ == '__main__':
while True:
try:#voeg try toe voor ononderbroken werking
bot.polling(none_stop=True)#start de bot
except:
time.sleep(10)#bij een crash
Start de bot opnieuw op:
killall python3
screen -dmS ServerBot python3 bot.py
Laten we opnieuw controleren of alles correct werkt:

Wanneer u op de knop onder het bericht drukt, zou de bot het commando moeten herhalen waar dit bericht vandaan kwam.
Ter afsluiting
Zeker, deze methode pretendeert geen vervanging te zijn voor de klassieke verbindingstechnieken, maar het stelt ons in staat om snel de status van de server te leren en commando's te verzenden die geen complexe uitvoer vereisen.
Bron: habr.com
