Truy cập vào máy chủ linux bằng bot Telegram trong Python

Khá thường xuyên có những tình huống cần truy cập vào máy chủ ở đây và ngay bây giờ. Tuy nhiên, kết nối qua SSH không phải lúc nào cũng là cách thuận tiện nhất vì bạn có thể không có sẵn máy khách SSH, địa chỉ máy chủ hoặc tổ hợp người dùng/mật khẩu. tất nhiên có Webmin, giúp đơn giản hóa việc quản trị, nhưng nó cũng không cung cấp khả năng truy cập tức thời.

Vì vậy, tôi quyết định thực hiện một giải pháp đơn giản nhưng thú vị. Cụ thể, để viết một bot Telegram, khi được khởi chạy trên chính máy chủ, sẽ thực thi các lệnh được gửi tới nó và trả về kết quả. Đã và đang học một số Điều về chủ đề này, tôi nhận ra rằng chưa có ai mô tả các triển khai như vậy.

Tôi đã triển khai dự án này trên Ubuntu 16.04, nhưng để chạy không gặp sự cố trên các bản phân phối khác, tôi đã cố gắng thực hiện mọi thứ theo cách chung.

đăng ký bot

Đăng ký bot mới với @BotFather. Chúng tôi gửi anh ấy /newbot và hơn nữa trong văn bản. Chúng tôi sẽ cần mã thông báo bot mới và id của bạn (ví dụ: bạn có thể lấy nó từ @userinfobot).

chuẩn bị trăn

Để chạy bot, chúng ta sẽ sử dụng thư viện telebot (pip install pytelegrambotapi). Sử dụng thư viện subprocess chúng tôi sẽ thực hiện các lệnh trên máy chủ.

khởi chạy bot

Tạo tệp bot.py trên máy chủ:
nano bot.py

Và dán mã vào đó:

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

Chúng tôi thay thế mã thông báo bot trong đó bằng mã do @BotFather cấp và user_id bằng giá trị id của tài khoản của bạn. Cần kiểm tra id người dùng để bot chỉ cung cấp quyền truy cập vào máy chủ của bạn cho bạn. Chức năng check_output() thực hiện lệnh đã cho và trả về kết quả.

Nó chỉ còn lại để bắt đầu bot. Để chạy các quy trình trên máy chủ, tôi thích sử dụng screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(trong đó "ServerBot" là ID tiến trình)

Quá trình sẽ tự động chạy trong nền. Hãy bắt đầu cuộc đối thoại với bot và kiểm tra xem mọi thứ có hoạt động bình thường không:

Truy cập vào máy chủ linux bằng bot Telegram trong Python

Chúc mừng! Bot thực thi các lệnh được gửi đến nó. Bây giờ, để truy cập vào máy chủ, bạn chỉ cần mở một cuộc đối thoại với bot.

Lệnh lặp lại

Thông thường, để theo dõi trạng thái của máy chủ, bạn phải thực hiện các lệnh tương tự. Do đó, việc thực hiện các lệnh lặp lại mà không gửi lại chúng sẽ rất lạc lõng.

Chúng tôi sẽ triển khai nó bằng các nút nội tuyến bên dưới thông báo:

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

Khởi động lại bot:

killall python3
screen -dmS ServerBot python3 bot.py

Hãy kiểm tra lại xem mọi thứ có hoạt động chính xác không:

Truy cập vào máy chủ linux bằng bot Telegram trong Python

Bằng cách nhấn nút bên dưới tin nhắn, bot phải lặp lại lệnh gửi tin nhắn này.

Thay vì một kết luận

Tất nhiên, phương pháp này không giả vờ thay thế các phương thức kết nối cổ điển, tuy nhiên, nó cho phép bạn nhanh chóng tìm hiểu về trạng thái của máy chủ và gửi lệnh tới nó mà không yêu cầu đầu ra phức tạp.

Nguồn: www.habr.com

Thêm một lời nhận xét