اغلب اوقات شرایطی وجود دارد که دسترسی به سرور در اینجا و اکنون مورد نیاز است. با این حال، اتصال از طریق SSH همیشه راحتترین راه نیست، زیرا ممکن است کلاینت SSH، آدرس سرور، یا ترکیب کاربر/رمز عبور در دسترس نباشد. البته دارند
بنابراین تصمیم گرفتم یک راه حل ساده اما جالب را پیاده سازی کنم. یعنی یک ربات تلگرام بنویسیم که وقتی روی خود سرور راه اندازی شد، دستورات ارسال شده به آن را اجرا کند و نتیجه را برگرداند. مطالعه کردن
من این پروژه را در اوبونتو 16.04 پیادهسازی کردم، اما برای اجرای بدون دردسر در سایر توزیعها، سعی کردم همه چیز را به صورت کلی انجام دهم.
ثبت ربات
یک ربات جدید با @BotFather ثبت کنید. او را می فرستیم /newbot
و در ادامه متن ما به یک توکن ربات جدید و شناسه شما نیاز داریم (برای مثال می توانید آن را از
آماده سازی پایتون
برای اجرای ربات، از کتابخانه استفاده می کنیم 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