Acces la serverul Linux folosind botul Telegram în Python

Destul de des există situații în care accesul la server este necesar aici și acum. Cu toate acestea, conectarea prin SSH nu este întotdeauna cea mai convenabilă modalitate, deoarece este posibil să nu aveți un client SSH, o adresă de server sau o combinație de utilizator/parolă la îndemână. Desigur că au web min, care simplifică administrarea, dar nici nu oferă acces instantaneu.

Așa că am decis să implementez o soluție simplă, dar interesantă. Și anume, să scrie un bot Telegram care, atunci când este lansat pe serverul propriu-zis, va executa comenzile trimise acestuia și va returna rezultatul. După ce a studiat unele articole pe această temă, mi-am dat seama că nimeni nu a descris încă astfel de implementări.

Am implementat acest proiect pe Ubuntu 16.04, dar pentru o rulare fără probleme pe alte distribuții, am încercat să fac totul într-un mod general.

Înregistrarea botului

Înregistrați un bot nou cu @BotFather. Îl trimitem /newbot și mai departe în text. Vom avea nevoie de un nou token bot și id-ul dvs. (îl puteți obține, de exemplu, de la @userinfobot).

Pregătirea pitonului

Pentru a rula bot-ul, vom folosi biblioteca telebot (pip install pytelegrambotapi). Utilizarea Bibliotecii subprocess vom executa comenzi pe server.

Lansare bot

Creați un fișier bot.py pe server:
nano bot.py

Și inserați codul în el:

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

Înlocuim simbolul bot din acesta cu cel emis de @BotFather și user_id cu valoarea ID-ului contului tău. Este necesară verificarea ID-ului utilizatorului, astfel încât botul să vă ofere acces la serverul dvs. numai dvs. Funcţie check_output() execută comanda dată și returnează rezultatul.

Rămâne doar să porniți botul. Pentru a rula procese pe server, prefer să folosesc screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(unde „ServerBot” este ID-ul procesului)

Procesul va rula automat în fundal. Să mergem la dialogul cu botul și să verificăm dacă totul funcționează așa cum ar trebui:

Acces la serverul Linux folosind botul Telegram în Python

Felicitări! Botul execută comenzile trimise către acesta. Acum, pentru a accesa serverul, trebuie doar să deschideți un dialog cu botul.

Repetarea comenzilor

Adesea, pentru a monitoriza starea serverului, trebuie să executați aceleași comenzi. Prin urmare, implementarea comenzilor repetate fără a le retrimite va fi foarte deplasată.

O vom implementa folosind butoanele inline sub mesajele:

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

Repornirea botului:

killall python3
screen -dmS ServerBot python3 bot.py

Să verificăm din nou dacă totul funcționează corect:

Acces la serverul Linux folosind botul Telegram în Python

Apăsând butonul de sub mesaj, botul trebuie să repete comanda de la care a fost trimis acest mesaj.

În loc de concluzie

Desigur, această metodă nu se pretinde a fi un înlocuitor pentru metodele clasice de conectare, cu toate acestea, vă permite să aflați rapid despre starea serverului și să îi trimiteți comenzi care nu necesită o ieșire complexă.

Sursa: www.habr.com

Adauga un comentariu