Πρόσβαση σε διακομιστή linux χρησιμοποιώντας bot Telegram στην Python

Αρκετά συχνά υπάρχουν περιπτώσεις όπου απαιτείται πρόσβαση στον διακομιστή εδώ και τώρα. Ωστόσο, η σύνδεση μέσω SSH δεν είναι πάντα ο πιο βολικός τρόπος, επειδή μπορεί να μην έχετε διαθέσιμο πρόγραμμα-πελάτη SSH, διεύθυνση διακομιστή ή συνδυασμό χρήστη/κωδικού πρόσβασης. Φυσικά έχουν Webmin, που απλοποιεί τη διαχείριση, αλλά δεν παρέχει επίσης άμεση πρόσβαση.

Αποφάσισα λοιπόν να εφαρμόσω μια απλή αλλά ενδιαφέρουσα λύση. Δηλαδή, να γράψει ένα bot Telegram που, όταν εκκινηθεί στον ίδιο τον διακομιστή, θα εκτελέσει τις εντολές που του αποστέλλονται και θα επιστρέψει το αποτέλεσμα. Έχοντας σπουδάσει μερικοί άρθρα σε αυτό το θέμα, συνειδητοποίησα ότι κανείς δεν έχει περιγράψει ακόμη τέτοιες υλοποιήσεις.

Υλοποίησα αυτό το έργο στο Ubuntu 16.04, αλλά για μια απρόσκοπτη εκτέλεση σε άλλες διανομές, προσπάθησα να κάνω τα πάντα με γενικό τρόπο.

Εγγραφή bot

Καταχωρίστε ένα νέο bot στο @BotFather. Του στέλνουμε /newbot και περαιτέρω στο κείμενο. Θα χρειαστούμε ένα νέο διακριτικό bot και το αναγνωριστικό σας (μπορείτε να το λάβετε, για παράδειγμα, από @userinfobot).

Προετοιμασία Python

Για να τρέξουμε το bot, θα χρησιμοποιήσουμε τη βιβλιοθήκη telebot (pip install pytelegrambotapi). Χρήση της Βιβλιοθήκης subprocess θα εκτελέσουμε εντολές στον διακομιστή.

Εκκίνηση bot

Δημιουργήστε ένα αρχείο bot.py στον διακομιστή:
nano bot.py

Και επικολλήστε τον κώδικα σε αυτό:

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

Αντικαθιστούμε το διακριτικό bot σε αυτό με αυτό που εκδόθηκε από τον @BotFather και το user_id με την τιμή αναγνωριστικού του λογαριασμού σας. Απαιτείται έλεγχος του αναγνωριστικού χρήστη, ώστε το bot να παρέχει πρόσβαση στον διακομιστή σας μόνο σε εσάς. Λειτουργία check_output() εκτελεί τη δεδομένη εντολή και επιστρέφει το αποτέλεσμα.

Απομένει μόνο να ξεκινήσει το bot. Για την εκτέλεση διεργασιών στον διακομιστή, προτιμώ να χρησιμοποιώ screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(όπου "ServerBot" είναι το αναγνωριστικό διαδικασίας)

Η διαδικασία θα εκτελεστεί αυτόματα στο παρασκήνιο. Ας πάμε στον διάλογο με το bot και ας ελέγξουμε ότι όλα λειτουργούν όπως πρέπει:

Πρόσβαση σε διακομιστή linux χρησιμοποιώντας bot Telegram στην Python

Συγχαρητήρια! Το bot εκτελεί τις εντολές που του αποστέλλονται. Τώρα, για να αποκτήσετε πρόσβαση στον διακομιστή, πρέπει απλώς να ανοίξετε έναν διάλογο με το bot.

Επανάληψη εντολών

Συχνά, για να παρακολουθείτε την κατάσταση του διακομιστή, πρέπει να εκτελέσετε τις ίδιες εντολές. Επομένως, η εφαρμογή επαναλαμβανόμενων εντολών χωρίς την εκ νέου αποστολή τους θα είναι πολύ άτοπη.

Θα το εφαρμόσουμε χρησιμοποιώντας ενσωματωμένα κουμπιά κάτω από τα μηνύματα:

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

Επανεκκίνηση του bot:

killall python3
screen -dmS ServerBot python3 bot.py

Ας ελέγξουμε ξανά ότι όλα λειτουργούν σωστά:

Πρόσβαση σε διακομιστή linux χρησιμοποιώντας bot Telegram στην Python

Πατώντας το κουμπί κάτω από το μήνυμα, το bot πρέπει να επαναλάβει την εντολή από την οποία στάλθηκε αυτό το μήνυμα.

Αντί για ένα συμπέρασμα

Φυσικά, αυτή η μέθοδος δεν προσποιείται ότι αντικαθιστά τις κλασικές μεθόδους σύνδεσης, ωστόσο, σας επιτρέπει να ενημερωθείτε γρήγορα για την κατάσταση του διακομιστή και να στείλετε εντολές σε αυτόν που δεν απαιτούν περίπλοκη έξοδο.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο