Aliro al linuksa servilo uzante Telegram-bot en Python

Sufiĉe ofte estas situacioj kiam aliro al la servilo estas necesa ĉi tie kaj nun. Tamen, konekti per SSH ne ĉiam estas la plej oportuna maniero, ĉar vi eble ne havas SSH-klienton, servilan adreson aŭ uzantan/pasvortan kombinaĵon ĉemane. Kompreneble havas Webmin, kiu simpligas administradon, sed ĝi ankaŭ ne disponigas tujan aliron.

Do mi decidis efektivigi simplan sed interesan solvon. Nome, por skribi Telegram-boton, kiu, kiam ĝi estas lanĉita sur la servilo mem, ekzekutos la ordonojn senditajn al ĝi kaj redonos la rezulton. Studinte pluraj artikoloj pri ĉi tiu temo, mi konstatis, ke neniu ankoraŭ priskribis tiajn realigojn.

Mi efektivigis ĉi tiun projekton sur Ubuntu 16.04, sed por senproblema funkciado en aliaj distribuoj, mi provis fari ĉion en ĝenerala maniero.

Bot-registrado

Registri novan bot kun @BotFather. Ni sendas lin /newbot kaj plu en la teksto. Ni bezonos novan bot-ĵetonon kaj vian identigilon (vi povas akiri ĝin, ekzemple, de @userinfobot).

Preparado de Python

Por ruli la bot, ni uzos la bibliotekon telebot (pip install pytelegrambotapi). Uzante la bibliotekon subprocess ni ekzekutos komandojn sur la servilo.

Bot-lanĉo

Kreu bot.py-dosieron sur la servilo:
nano bot.py

Kaj algluu la kodon en ĝin:

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)#в случае падения

Ni anstataŭigas la bot-ĵetonon en ĝi per tiu eldonita de @BotFather, kaj user_id kun la id-valoro de via konto. Kontroli la uzantidentigilon necesas por ke la bot nur al vi ebligu aliron al via servilo. Funkcio check_output() plenumas la donitan komandon kaj resendas la rezulton.

Restas nur komenci la bot. Por ruli procezojn sur la servilo, mi preferas uzi screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kie "ServerBot" estas la proceza ID)

La procezo aŭtomate funkcios en la fono. Ni iru al la dialogo kun la bot kaj kontrolu, ke ĉio funkcias kiel ĝi devus:

Aliro al linuksa servilo uzante Telegram-bot en Python

Gratulon! La roboto plenumas la ordonojn senditajn al ĝi. Nun, por aliri la servilon, vi nur bezonas malfermi dialogon kun la bot.

Komanda ripeto

Ofte, por kontroli la staton de la servilo, vi devas ekzekuti la samajn komandojn. Tial, la efektivigo de ripetado de komandoj sen resendi ilin estos tre malloka.

Ni efektivigos ĝin uzante enliniajn butonojn sub la mesaĝoj:

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)#в случае падения

Rekomencante la bot:

killall python3
screen -dmS ServerBot python3 bot.py

Ni kontrolu denove, ke ĉio funkcias ĝuste:

Aliro al linuksa servilo uzante Telegram-bot en Python

Premante la butonon sub la mesaĝo, la bot devas ripeti la komandon de kiu ĉi tiu mesaĝo estis sendita.

Anstataŭ konkludo

Kompreneble, ĉi tiu metodo ne ŝajnigas esti anstataŭaĵo por la klasikaj konektmetodoj, tamen ĝi permesas vin rapide ekscii pri la stato de la servilo kaj sendi al ĝi komandojn, kiuj ne postulas kompleksan eligon.

fonto: www.habr.com

Aldoni komenton