Даволі часта адбываюцца сітуацыі, калі доступ да сервера патрэбен тут і зараз. Аднак, не заўсёды падлучэнне па SSH з'яўляецца найболей зручным спосабам, таму што пад рукой можа не апынуцца SSH кліента, адрасы сервера або звязкі «карыстальнік/пароль». Канешне ёсць
Таму я вырашыў рэалізаваць простае, але цікавае рашэнне. А менавіта – напісаць Telegram-бота, які, запускаючыся на самім серверы, будзе выконваць дасыланыя яму каманды і вяртаць вынік. Вывучыўшы
Дадзены праект я рэалізоўваў на Ubuntu 16.04/XNUMX, але для беспраблемнага запуску на іншых дыстрыбутывах я пастараўся зрабіць усё ў агульным выглядзе.
Рэгістрацыя бота
Рэгіструем новага робата ў @BotFather. Адпраўляем яму /newbot
і далей па тэксце. Нам спатрэбяцца токен новага робата і ваш id (атрымаць яго можна, напрыклад, у
Падрыхтоўка пітона
Для запуску бота будзем выкарыстоўваць бібліятэку telebot
(pip install pytelegrambotapi
). З дапамогай бібліятэкі subprocess
будзем выконваць каманды на сэрвэры.
Запуск бота
На сэрвэры ствараем файл bot.py:
nano bot.py
І ўстаўляемы ў яго код:
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)#в случае падения
Замяняем у ім токен робата на той, які выдаў @BotFather, і user_id – на значэнне id вашага акаўнта. Праверка id карыстача патрэбна для таго, каб робат падаваў доступ да вашага сервера толькі вам. Функцыя check_output()
выконвае перададзеную каманду і вяртае вынік.
Засталося толькі запусціць робата. Для запуску працэсаў на серверы я аддаю перавагу выкарыстоўваць screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(дзе "ServerBot" - ідэнтыфікатар працэсу)
Працэс аўтаматычна запусціцца ў фонам рэжыме. Пяройдзем у дыялог з ботам і праверым, што ўсё працуе, як трэба:
Сongratulations! Бот выконвае дасыланыя яму каманды. Зараз, каб атрымаць доступ да сервера, вам дастаткова адкрыць дыялог з ботам.
Паўтарэнне каманд
Часцяком, для маніторынгу стану сервера даводзіцца выконваць адны і тыя ж каманды. Таму рэалізацыя паўтору каманд без іх паўторнага адпраўлення будзе вельмі дарэчы.
Рэалізоўваць будзем пры дапамозе inline кнопак пад паведамленнямі:
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)#в случае падения
Перазапускаем бота:
killall python3
screen -dmS ServerBot python3 bot.py
Зноў праверым, што ўсё працуе карэктна:
Па націску кнопкі пад паведамленнем робат павінен паўтараць каманду, ад якой было даслана дадзенае паведамленне.
замест заключэння
Безумоўна, такі метад не прэтэндуе стаць заменай класічным спосабам падлучэння, аднак, ён дазваляе досыць хутка пазнаць аб стане сервера і адправіць яму каманды, не патрабавальныя складанай высновы.
Крыніца: habr.com