Der sker ofte situationer, hvor adgang til serveren er nødvendig her og nu. Men forbindelsen via SSH er ikke altid den mest bekvemme metode, fordi man måske ikke har en SSH-klient, serverens adresse eller en kombination af "bruger/erhverv". Selvfølgelig er der , som forenkler administrationen, men det giver heller ikke øjeblikkelig adgang.
Derfor besluttede jeg at implementere en simpel, men interessant løsning. Nemlig at skrive en Telegram-bot, der, når den kører på serveren, vil udføre de kommandoer, den modtager, og returnere resultatet. Efter at have undersøgt emner om dette, indså jeg, at ingen tidligere havde beskrevet lignende implementeringer.
Dette projekt implementerede jeg på Ubuntu 16.04, men for at sikre problemfri drift på andre distributioner har jeg forsøgt at gøre alt i en generel form.
Registrering af bot
Vi registrerer en ny bot hos @BotFather. Vi sender ham /newbot og så videre. Vi har brug for tokenet fra den nye bot og dit id (du kan få det fra for eksempel ).
Forberedelse af Python
Til at starte bot'en vil vi bruge biblioteket telebot (pip install pytelegrambotapi). Ved hjælp af biblioteket subprocess vil vi udføre kommandoer på serveren.
Start af bot
Vi opretter en fil på serveren kaldet bot.py:
nano bot.py
Og indsætter koden:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#bot token
user_id = 0 #id på din konto
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #tjekker, at det er ejeren, der skriver
comand = message.text #tekst af beskeden
try: #hvis kommandoen ikke kan udføres, vil check_output kaste en undtagelse
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Ugyldigt input") #hvis kommandoen er forkert
if __name__ == '__main__':
while True:
try:#tilføjer try for uafbrudt drift
bot.polling(none_stop=True)#starter bot'en
except:
time.sleep(10)#hvis der opstår nedbrud
Erstat teksttokenet med det, der blev givet af @BotFather, og user_id med værdien af din kontos id. Tjek af id på brugeren er nødvendigt, så bot'en kun giver dig adgang til din server. Funktionen check_output() udfører den modtagne kommando og returnerer resultatet.
Det er kun tilbage at starte bot'en. For at starte processer på serveren foretrækker jeg at bruge screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(hvor "ServerBot" er proces-ID'en)
Processen vil automatisk starte i baggrunden. Lad os gå ind i dialogen med botten og tjekke, at alt fungerer, som det skal:

Tillykke! Botten udfører de kommandoer, den modtager. Nu, for at få adgang til serveren, er det nok at åbne dialogen med botten.
Gentagelse af kommandoer
Ofte kræver overvågning af serverens tilstand, at man udfører de samme kommandoer igen og igen. Derfor vil implementeringen af kommandoer uden at skulle sende dem igen være meget nyttig.
Vi vil implementere dette ved hjælp af inline-knapper under beskederne:
from subprocess import check_output
import telebot
from telebot import types # Tilføjer import af knapper
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")# Bot-token
user_id = 0 # id på din konto
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): # tjekker, om det er ejeren, der skriver
comand = message.text # beskedens tekst
markup = types.InlineKeyboardMarkup() # laver tastaturet
button = types.InlineKeyboardButton(text="Gentag", callback_data=comand) # laver knappen
markup.add(button) # tilføjer knappen til tastaturet
try: # hvis kommandoen ikke kan udføres, vil check_output give en exception
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) # kalder kommandoen og sender besked med resultatet
except:
bot.send_message(user_id, "Ugyldig input") # hvis kommandoen er forkert
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data # læser kommandoen fra knapdatafeltet
try: # hvis kommandoen ikke kan udføres, vil check_output give en exception
markup = types.InlineKeyboardMarkup() # laver tastaturet
button = types.InlineKeyboardButton(text="Gentag", callback_data=comand) # laver knappen og sender kommandoen i data
markup.add(button) # tilføjer knappen til tastaturet
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) # kalder kommandoen og sender besked med resultatet
except:
bot.send_message(user_id, "Ugyldig input") # hvis kommandoen er forkert
if __name__ == '__main__':
while True:
try: # tilføjer try for uafbrudt drift
bot.polling(none_stop=True) # starter botten
except:
time.sleep(10) # ved nedbrud
Genstarter botten:
killall python3
screen -dmS ServerBot python3 bot.py
Lad os tjekke, at alt fungerer korrekt:

Når knappen under beskeden trykkes, skal botten gentage den kommando, som denne besked blev sendt fra.
Afslutning
Selvfølgelig kan denne metode ikke erstatte klassiske forbindelsesmetoder, men den giver mulighed for hurtigt at få information om serverens tilstand og sende den kommandoer, der ikke kræver komplekse udskrifter.
Kilde: habr.com
