Dostop do strežnika Linux z uporabo Telegram bota v Pythonu

Pogosto se pojavijo situacije, ko je dostop do strežnika potreben tukaj in zdaj. Vendar pa povezovanje prek SSH ni vedno najprimernejši način, ker morda nimate pri roki odjemalca SSH, naslova strežnika ali kombinacije uporabnik/geslo. Seveda imajo Webmin, ki poenostavlja administracijo, vendar tudi ne omogoča takojšnjega dostopa.

Zato sem se odločil implementirati preprosto, a zanimivo rešitev. In sicer napisati Telegram bota, ki bo ob zagonu na samem strežniku izvajal ukaze, ki so mu poslani, in vrnil rezultat. Ob študiju nekateri članki na tej temi sem ugotovil, da še nihče ni opisal takih izvedb.

Ta projekt sem implementiral na Ubuntu 16.04, vendar sem za nemoteno delovanje na drugih distribucijah poskušal narediti vse na splošen način.

Registracija botov

Registrirajte novega bota z @BotFather. Pošljemo ga /newbot in naprej v besedilu. Potrebovali bomo nov žeton bota in vaš ID (lahko ga dobite na primer pri @userinfobot).

Priprava na Python

Za zagon bota bomo uporabili knjižnico telebot (pip install pytelegrambotapi). Uporaba knjižnice subprocess bomo izvajali ukaze na strežniku.

Zagon bota

Na strežniku ustvarite datoteko bot.py:
nano bot.py

In vanj prilepite kodo:

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

Žeton bota v njem zamenjamo s tistim, ki ga je izdal @BotFather, user_id pa z vrednostjo id vašega računa. Preverjanje ID-ja uporabnika je potrebno, da bo bot omogočil dostop do vašega strežnika samo vam. funkcija check_output() izvede podani ukaz in vrne rezultat.

Ostaja samo zagon bota. Za izvajanje procesov na strežniku raje uporabljam screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kjer je "ServerBot" ID procesa)

Postopek se samodejno izvaja v ozadju. Pojdimo v dialog z botom in preverimo, ali vse deluje, kot bi moralo:

Dostop do strežnika Linux z uporabo Telegram bota v Pythonu

čestitke! Bot izvaja ukaze, ki so mu poslani. Zdaj, če želite dostopati do strežnika, morate samo odpreti dialog z botom.

Ponavljanje ukaza

Za spremljanje stanja strežnika morate pogosto izvajati iste ukaze. Zato bo izvajanje ponavljajočih se ukazov brez ponovnega pošiljanja zelo neprimerno.

Implementirali ga bomo z vgrajenimi gumbi pod sporočili:

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

Ponovni zagon bota:

killall python3
screen -dmS ServerBot python3 bot.py

Ponovno preverimo, ali vse deluje pravilno:

Dostop do strežnika Linux z uporabo Telegram bota v Pythonu

S pritiskom na gumb pod sporočilom mora bot ponoviti ukaz, iz katerega je bilo to sporočilo poslano.

Namesto zaključka

Seveda se ta metoda ne pretvarja, da je zamenjava za klasične načine povezovanja, vendar vam omogoča, da hitro ugotovite stanje strežnika in mu pošljete ukaze, ki ne zahtevajo zapletenega izpisa.

Vir: www.habr.com

Dodaj komentar