غالبًا ما تكون هناك مواقف عندما يكون الوصول إلى الخادم مطلوبًا هنا والآن. ومع ذلك ، فإن الاتصال عبر SSH ليس دائمًا الطريقة الأكثر ملاءمة ، لأنه قد لا يكون لديك عميل SSH أو عنوان خادم أو مجموعة مستخدم / كلمة مرور في متناول اليد. بالطبع
لذلك قررت تنفيذ حل بسيط ولكنه مثير للاهتمام. على وجه التحديد ، لكتابة Telegram bot الذي ، عند تشغيله على الخادم نفسه ، سينفذ الأوامر المرسلة إليه ويعيد النتيجة. بعد أن درست
لقد نفذت هذا المشروع على Ubuntu 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