Pristup linux serveru pomoću Telegram bota u Pythonu

Često postoje situacije kada je pristup serveru potreban ovdje i sada. Međutim, povezivanje putem SSH-a nije uvijek najpogodniji način, jer možda nemate pri ruci SSH klijenta, adresu servera ili kombinaciju korisnika/lozinke. Naravno Webmin, što pojednostavljuje administraciju, ali isto tako ne pruža 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 su mu poslane i vraćati rezultat. Proučivši nekoliko članci na ovu temu, shvatio sam da takve implementacije još niko nije opisao.

Implementirao sam ovaj projekat na Ubuntu 16.04, ali za nesmetano pokretanje na drugim distribucijama, pokušao sam sve napraviti na opći način.

Registracija bota

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

Priprema za Python

Za pokretanje bota koristit ćemo biblioteku telebot (pip install pytelegrambotapi). Korištenje biblioteke subprocess izvršićemo komande na serveru.

Pokretanje bota

Kreirajte bot.py fajl na serveru:
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)#в случае падения

U njemu zamjenjujemo bot token onim koji je izdao @BotFather, a user_id vrijednošću id vašeg računa. Provjera korisničkog ID-a je potrebna kako bi bot omogućio pristup vašem serveru samo vama. Funkcija check_output() izvršava zadatu naredbu i vraća rezultat.

Ostaje samo pokrenuti bot. Za pokretanje procesa na serveru 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 sa botom i provjerimo da li sve radi kako treba:

Pristup linux serveru pomoću Telegram bota u Pythonu

Čestitamo! Bot izvršava naredbe koje su mu poslane. Sada, da biste pristupili serveru, potrebno je samo da otvorite dijalog sa botom.

Ponavljanje komande

Često, da biste pratili stanje servera, morate izvršiti iste komande. Stoga će implementacija ponavljanja naredbi bez njihovog ponovnog slanja biti vrlo deplasirana.

Implementiraćemo ga pomoću ugrađenih dugmadi 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 da li sve radi kako treba:

Pristup linux serveru pomoću Telegram bota u Pythonu

Pritiskom na dugme ispod poruke bot mora ponoviti komandu sa koje je ova poruka poslata.

Umjesto zaključka

Naravno, ova metoda ne pretenduje da bude zamjena za klasične metode povezivanja, međutim, omogućava vam da brzo saznate o stanju servera i pošaljete mu naredbe koje ne zahtijevaju složeni izlaz.

izvor: www.habr.com

Dodajte komentar