Pristup linux poslužitelju pomoću Telegram bota u Pythonu

Vrlo često postoje situacije kada je pristup poslužitelju potreban ovdje i sada. Međutim, povezivanje putem SSH-a nije uvijek najprikladniji način jer možda nemate pri ruci SSH klijenta, adresu poslužitelja ili kombinaciju korisnika/lozinke. Naravno da jesu Webmin, što pojednostavljuje administraciju, ali također ne omogućuje trenutni pristup.

Stoga sam odlučio implementirati jednostavno, ali zanimljivo rješenje. Naime, napisati Telegram bot koji će, kada se pokrene na samom serveru, izvršavati naredbe koje mu se šalju i vraćati rezultat. Proučivši više članci na ovoj temi sam shvatio da još nitko nije opisao takve implementacije.

Implementirao sam ovaj projekt na Ubuntu 16.04, ali za nesmetan rad na drugim distribucijama, pokušao sam napraviti sve na općeniti način.

Registracija bota

Registrirajte novog bota s @BotFather. Mi ga šaljemo /newbot i dalje u tekstu. Trebat će nam novi token bota i vaš ID (možete ga dobiti, na primjer, od @userinfobot).

Python priprema

Za pokretanje bota koristit ćemo biblioteku telebot (pip install pytelegrambotapi). Korištenje knjižnice subprocess mi ćemo izvršavati naredbe na poslužitelju.

Pokretanje bota

Napravite datoteku bot.py na poslužitelju:
nano bot.py

I zalijepite kod u njega:

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 u njemu zamjenjujemo onim koji je izdao @BotFather, a user_id s id vrijednošću vašeg računa. Provjera korisničkog ID-a je potrebna kako bi bot omogućio pristup vašem poslužitelju samo vama. Funkcija check_output() izvršava zadanu naredbu i vraća rezultat.

Ostaje samo pokrenuti bot. Za pokretanje procesa na poslužitelju radije koristim screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(gdje je "ServerBot" ID procesa)

Proces će se automatski pokrenuti u pozadini. Idemo u dijalog s botom i provjerimo radi li sve kako treba:

Pristup linux poslužitelju pomoću Telegram bota u Pythonu

Čestitamo! Bot izvršava naredbe koje su mu poslane. Sada, da biste pristupili poslužitelju, samo trebate otvoriti dijalog s botom.

Ponavljanje naredbe

Često, da biste pratili stanje poslužitelja, morate izvršiti iste naredbe. Stoga će implementacija ponavljanja naredbi bez ponovnog slanja biti vrlo neprikladna.

Implementirat ćemo ga pomoću ugrađenih gumba ispod poruka:

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

Ponovno pokretanje bota:

killall python3
screen -dmS ServerBot python3 bot.py

Provjerimo još jednom radi li sve ispravno:

Pristup linux poslužitelju pomoću Telegram bota u Pythonu

Pritiskom na gumb ispod poruke bot mora ponoviti naredbu iz koje je ova poruka poslana.

Umjesto zaključka

Naravno, ova metoda ne pretendira biti zamjena za klasične metode povezivanja, ali vam omogućuje da brzo saznate o stanju poslužitelja i pošaljete mu naredbe koje ne zahtijevaju složen izlaz.

Izvor: www.habr.com

Dodajte komentar