دسترسی به سرور لینوکس با استفاده از ربات تلگرام در پایتون

اغلب اوقات شرایطی وجود دارد که دسترسی به سرور در اینجا و اکنون مورد نیاز است. با این حال، اتصال از طریق SSH همیشه راحت‌ترین راه نیست، زیرا ممکن است کلاینت SSH، آدرس سرور، یا ترکیب کاربر/رمز عبور در دسترس نباشد. البته دارند Webmin، که مدیریت را ساده می کند، اما دسترسی فوری را نیز فراهم نمی کند.

بنابراین تصمیم گرفتم یک راه حل ساده اما جالب را پیاده سازی کنم. یعنی یک ربات تلگرام بنویسیم که وقتی روی خود سرور راه اندازی شد، دستورات ارسال شده به آن را اجرا کند و نتیجه را برگرداند. مطالعه کردن برخی از مقالات در مورد این موضوع، متوجه شدم که هیچ کس هنوز چنین پیاده سازی هایی را توصیف نکرده است.

من این پروژه را در اوبونتو 16.04 پیاده‌سازی کردم، اما برای اجرای بدون دردسر در سایر توزیع‌ها، سعی کردم همه چیز را به صورت کلی انجام دهم.

ثبت ربات

یک ربات جدید با @BotFather ثبت کنید. او را می فرستیم /newbot و در ادامه متن ما به یک توکن ربات جدید و شناسه شما نیاز داریم (برای مثال می توانید آن را از @userinfobot).

آماده سازی پایتون

برای اجرای ربات، از کتابخانه استفاده می کنیم telebot (pip install pytelegrambotapi). با استفاده از کتابخانه subprocess ما دستورات را روی سرور اجرا خواهیم کرد.

راه اندازی ربات

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

توکن ربات موجود در آن را با کد صادر شده توسط @BotFather جایگزین می کنیم و user_id را با مقدار شناسه حساب شما جایگزین می کنیم. بررسی شناسه کاربری لازم است تا ربات دسترسی به سرور شما را فقط برای شما فراهم کند. تابع check_output() دستور داده شده را اجرا می کند و نتیجه را برمی گرداند.

تنها راه اندازی ربات باقی مانده است. برای اجرای فرآیندهای روی سرور، ترجیح می دهم از آن استفاده کنم screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(که در آن "ServerBot" شناسه فرآیند است)

فرآیند به طور خودکار در پس زمینه اجرا می شود. بیایید به گفتگو با ربات برویم و بررسی کنیم که همه چیز همانطور که باید کار می کند:

دسترسی به سرور لینوکس با استفاده از ربات تلگرام در پایتون

تبریک می گویم! ربات دستورات ارسال شده به آن را اجرا می کند. اکنون، برای دسترسی به سرور، فقط باید یک گفتگو با ربات باز کنید.

تکرار دستور

اغلب، برای نظارت بر وضعیت سرور، باید همان دستورات را اجرا کنید. بنابراین اجرای تکرار دستورات بدون ارسال مجدد آنها بسیار نابجا خواهد بود.

ما آن را با استفاده از دکمه های درون خطی زیر پیام ها پیاده سازی می کنیم:

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

راه اندازی مجدد ربات:

killall python3
screen -dmS ServerBot python3 bot.py

بیایید دوباره بررسی کنیم که همه چیز درست کار می کند:

دسترسی به سرور لینوکس با استفاده از ربات تلگرام در پایتون

با فشردن دکمه زیر پیام، ربات باید دستوری که از آن پیام ارسال شده را تکرار کند.

به جای یک نتیجه گیری

البته این روش وانمود نمی‌کند که جایگزینی برای روش‌های اتصال کلاسیک باشد، با این حال به شما این امکان را می‌دهد که به سرعت از وضعیت سرور مطلع شوید و دستوراتی را به آن ارسال کنید که نیاز به خروجی پیچیده ندارند.

منبع: www.habr.com

اضافه کردن نظر