غالبًا ما تكون هناك مواقف عندما يكون الوصول إلى الخادم مطلوبًا هنا والآن. ومع ذلك ، فإن الاتصال عبر 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
