Často sa stáva, že prístup k serveru je potrebný okamžite. Nie vždy je však pripojenie cez SSH najpohodlnejší spôsob, pretože nemusí byť poruke SSH klient, adresa servera alebo kombinácia „používateľ/heslo“. Samozrejme, existuje , ktorý zjednodušuje administráciu, ale tiež neposkytuje okamžitý prístup.
Preto som sa rozhodol implementovať jednoduché, ale zaujímavé riešenie. Konkrétne – napísať Telegram bota, ktorý, spúšťaný na samotnom serveri, vykonáva posielané mu príkazy a vracia výsledok. Po preskúmaní na túto tému, som si uvedomil, že podobné implementácie nikto ešte nepopísal.
Tento projekt som realizoval na Ubuntu 16.04, ale pre bezproblémový chod na iných distribúciách som sa snažil urobiť všetko vo všeobecnej forme.
Registrácia bota
Zaregistrujeme nového bota u @BotFather. Posielame mu /newbot a pokračujeme v texte. Potrebujeme token nového bota a váš id (získať ho môžete napríklad cez ).
Príprava Pythonu
Na spustenie bota budeme používať knižnicu telebot (pip install pytelegrambotapi). Pomocou knižnice subprocess budeme vykonávať príkazy na serveri.
Spustenie bota
Na serveri vytvoríme súbor bot.py:
nano bot.py
A vložíme do neho kód:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token bota
user_id = 0 #id vášho účtu
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #kontrolujeme, že píše práve majiteľ
comand = message.text #text správy
try: #ak je príkaz nevykonateľný, - check_output vyhodí výnimku
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Neplatný vstup") #ak je príkaz nekorektný
if __name__ == '__main__':
while True:
try:#pridáme try pre bezproblémovú prevádzku
bot.polling(none_stop=True)#spustenie bota
except:
time.sleep(10)#v prípade pádu
Nahradíme v ňom token bota tým, ktorý vydal @BotFather, a user_id – hodnotou id vášho účtu. Kontrola id používateľa je potrebná na to, aby bot poskytoval prístup k vášmu serveru len vám. Funkcia check_output() vykonáva prenesený príkaz a vracia výsledok.
Zostáva len spustiť bota. Na spustenie procesov na serveri uprednostňujem používať screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(kde „ServerBot“ je identifikátor procesu)
Proces sa automaticky spustí na pozadí. Prejdeme do dialógu s botom a skontrolujeme, či všetko funguje, ako má:

Gratulujeme! Bot vykonáva príkazy, ktoré mu posielate. Teraz stačí otvoriť dialóg s botom, aby ste získali prístup k serveru.
Opakovanie príkazov
Často je potrebné na monitorovanie stavu servera vykonávať tie isté príkazy. Preto bude veľmi užitočné implementovať opakovanie príkazov bez ich opätovného posielania.
Implementovať budeme pomocou inline tlačidiel pod správami:
from subprocess import check_output
import telebot
from telebot import types #Pridávame import tlačidiel
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token bota
user_id = 0 #id vášho účtu
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #kontrolujeme, či píše práve majiteľ
comand = message.text #text správy
markup = types.InlineKeyboardMarkup() #vytvárame klávesnicu
button = types.InlineKeyboardButton(text="Opakovať", callback_data=comand) #vytvárame tlačidlo
markup.add(button) #pridávame tlačidlo do klávesnice
try: #ak príkaz nie je vykonateľný - check_output vyhodí výnimku
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) #vyvolávame príkaz a posielame správu s výsledkom
except:
bot.send_message(user_id, "Neplatný vstup") #ak je príkaz nekorektný
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data #čítame príkaz z poľa tlačidla data
try:#ak príkaz nie je vykonateľný - check_output vyhodí výnimku
markup = types.InlineKeyboardMarkup() #vytvárame klávesnicu
button = types.InlineKeyboardButton(text="Opakovať", callback_data=comand) #vytvárame tlačidlo a do data vkladáme príkaz
markup.add(button) #pridávame tlačidlo do klávesnice
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #vyvolávame príkaz a posielame správu s výsledkom
except:
bot.send_message(user_id, "Neplatný vstup") #ak je príkaz nekorektný
if __name__ == '__main__':
while True:
try:#pridávame try na nepretržitú prevádzku
bot.polling(none_stop=True)#spúšťame bota
except:
time.sleep(10)#v prípade pádu
Reštartujeme bota:
killall python3
screen -dmS ServerBot python3 bot.py
Znova skontrolujeme, či všetko funguje správne:

Po stlačení tlačidla pod správou by mal bot opakovať príkaz, ktorý bol poslaný v tejto správe.
Na záver
Samozrejme, tento spôsob nemôže nahradiť klasické metódy pripojenia, avšak umožňuje dosť rýchlo zistiť stav servera a poslať mu príkazy, ktoré nevyžadujú zložitý výstup.
Zdroj: habr.com
