Poměrně často nastávají situace, kdy je potřeba přístup na server tady a teď. Připojení přes SSH však není vždy nejpohodlnější způsob, protože nemusíte mít po ruce SSH klienta, adresu serveru nebo kombinaci uživatele a hesla. Samozřejmě že ano
Rozhodl jsem se tedy implementovat jednoduché, ale zajímavé řešení. Konkrétně napsat telegramového robota, který po spuštění na samotném serveru provede příkazy, které mu byly zaslány, a vrátí výsledek. Po studiu
Tento projekt jsem implementoval na Ubuntu 16.04, ale pro bezproblémový chod na jiných distribucích jsem se snažil vše udělat obecně.
Registrace bota
Zaregistrujte nového robota u @BotFather. Posíláme ho /newbot
a dále v textu. Budeme potřebovat nový token bota a vaše ID (můžete ho získat např
Příprava Pythonu
Ke spuštění robota použijeme knihovnu telebot
(pip install pytelegrambotapi
). Používání knihovny subprocess
budeme provádět příkazy na serveru.
Spuštění robota
Vytvořte soubor bot.py na serveru:
nano bot.py
A vložte do něj kód:
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)#в случае падения
Token bota v něm nahradíme tokenem vydaným @BotFather a user_id hodnotou id vašeho účtu. Kontrola ID uživatele je nutná, aby bot poskytoval přístup k vašemu serveru pouze vám. Funkce check_output()
provede daný příkaz a vrátí výsledek.
Zbývá pouze spustit robota. Pro běh procesů na serveru preferuji použití screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(kde "ServerBot" je ID procesu)
Proces bude automaticky spuštěn na pozadí. Pojďme k dialogu s robotem a zkontrolujte, zda vše funguje, jak má:
Gratulujeme! Robot provádí příkazy, které mu byly zaslány. Nyní, abyste se dostali na server, stačí otevřít dialog s robotem.
Opakování příkazu
Chcete-li sledovat stav serveru, musíte často provádět stejné příkazy. Proto bude implementace opakujících se příkazů bez jejich opětovného odeslání velmi nemístné.
Implementujeme to pomocí inline tlačítek pod zprávami:
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)#в случае падения
Restartování robota:
killall python3
screen -dmS ServerBot python3 bot.py
Znovu zkontrolujte, zda vše funguje správně:
Stisknutím tlačítka pod zprávou musí bot zopakovat příkaz, ze kterého byla tato zpráva odeslána.
Místo závěru
Tento způsob se samozřejmě netváří jako náhrada za klasické způsoby připojení, nicméně umožňuje rychle zjistit stav serveru a odesílat na něj příkazy, které nevyžadují složitý výstup.
Zdroj: www.habr.com