Poměrně často nastávají situace, kdy je potřeba mít přístup k serveru okamžitě. Nicméně, připojení přes SSH nemusí být vždy nejpohodlnější způsob, protože nemusí být po ruce SSH klient, adresa serveru nebo kombinace „uživatel/hES kod“. Samozřejmě existuje , který usnadňuje správu, ale také neposkytuje okamžitý přístup.
Proto jsem se rozhodl realizovat jednoduché, ale zajímavé řešení. A to napsat Telegram bota, který, spuštěný na samotném serveru, bude vykonávat příkazy, které mu pošlete, a vracet výsledky. Po prostudování této problematiky jsem zjistil, že podobné realizace ještě nikdo nepopisoval.
Tento projekt jsem realizoval na Ubuntu 16.04, ale pro bezproblémové spuštění na jiných distribucích jsem se snažil udělat všeobecně.
Registrace bota
Zaregistrujeme nového bota u @BotFather. Pošleme mu /newbot a dále podle textu. Budeme potřebovat token nového bota a vaše id (můžete získat například u ).
Příprava Pythonu
Pro spuštění bota použijeme knihovnu telebot (pip install pytelegrambotapi). S pomocí knihovny subprocess budeme vykonávat příkazy na serveru.
Spuštění bota
Na serveru vytvoříme soubor bot.py:
nano bot.py
A vložíme do něj kód:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token bota
user_id = 0 #id vašeho účtu
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #ověřujeme, že píše opravdu majitel
comand = message.text #text zprávy
try: #pokud je příkaz neproveditelný - check_output vyvolá výjimku
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Neplatný vstup") #pokud je příkaz nesprávný
if __name__ == '__main__':
while True:
try:#přidáváme try pro bezproblémový provoz
bot.polling(none_stop=True)#spuštění bota
except:
time.sleep(10)#v případě pádu
Změníme v něm token bota na ten, který poskytl @BotFather, a user_id na hodnotu id vašeho účtu. Ověření id uživatele je nutné, aby bot poskytoval přístup k vašemu serveru pouze vám. Funkce check_output() provádí předaný příkaz a vrací výsledek.
Zbývá jen spustit bota. Pro spuštění procesů na serveru preferuji použít screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(kde „ServerBot“ je identifikátor procesu)
Proces se automaticky spustí na pozadí. Přesuneme se do dialogu s botem a zkontrolujeme, že vše funguje, jak má:

Gratulujeme! Bot vykonává zaslané mu příkazy. Nyní, abyste získali přístup k serveru, stačí otevřít dialog s botem.
Opakování příkazů
Často je třeba pro monitorování stavu serveru provádět stále stejné příkazy. Proto bude implementace opakování příkazů bez jejich znovu odeslání velmi užitečná.
Realizujeme pomocí inline tlačítek pod zprávami:
from subprocess import check_output
import telebot
from telebot import types #Přidáme import tlačítek
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token bota
user_id = 0 #id vašeho účtu
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #kontrola, že píše opravdu majitel
comand = message.text #text zprávy
markup = types.InlineKeyboardMarkup() #vytvoření klávesnice
button = types.InlineKeyboardButton(text="Opakovat", callback_data=comand) #vytvoření tlačítka
markup.add(button) #přidání tlačítka do klávesnice
try: #pokud příkaz není proveditelný - check_output vrátí výjimku
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) #vyvolání příkazu a odeslání zprávy s výsledkem
except:
bot.send_message(user_id, "Neplatný vstup") #pokud je příkaz neplatný
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data #načtení příkazu z pole tlačítka data
try:#pokud příkaz není proveditelný - check_output vrátí výjimku
markup = types.InlineKeyboardMarkup() #vytvoření klávesnice
button = types.InlineKeyboardButton(text="Opakovat", callback_data=comand) #vytvoření tlačítka a do data předání příkazu
markup.add(button) #přidání tlačítka do klávesnice
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #vyvolání příkazu a odeslání zprávy s výsledkem
except:
bot.send_message(user_id, "Neplatný vstup") #pokud je příkaz neplatný
if __name__ == '__main__':
while True:
try:#přidání try pro nepřerušovanou činnost
bot.polling(none_stop=True)#spuštění bota
except:
time.sleep(10)#v případě pádu
Znovu spouštíme bota:
killall python3
screen -dmS ServerBot python3 bot.py
Znovu ověříme, že vše funguje správně:

Po stisknutí tlačítka pod zprávou by měl bot opakovat příkaz, ze kterého byla tato zpráva zaslána.
Na závěr
Bezpochyby, tato metoda se nemůže stát náhradou klasických způsobů připojení, ale dovoluje rychle zjistit stav serveru a zasílat mu příkazy, které nevyžadují složitý výstup.
Zdroj: habr.com
