Çox vaxt serverə girişin burada və indi lazım olduğu vəziyyətlər var. Bununla belə, SSH vasitəsilə qoşulmaq həmişə ən əlverişli yol deyil, çünki əlinizdə SSH müştərisi, server ünvanı və ya istifadəçi/parol kombinasiyası olmaya bilər. Əlbəttə var
Buna görə sadə, lakin maraqlı bir həll tətbiq etmək qərarına gəldim. Məhz, serverin özündə işə salındıqda ona göndərilən əmrləri yerinə yetirəcək və nəticəni qaytaracaq Telegram botu yazmaq. Oxuyub
Mən bu layihəni Ubuntu 16.04-də həyata keçirdim, lakin digər paylanmalarda problemsiz işləmək üçün hər şeyi ümumi şəkildə etməyə çalışdım.
Botun qeydiyyatı
@BotFather ilə yeni botu qeydiyyatdan keçirin. Onu göndəririk /newbot
və daha sonra mətndə. Bizə yeni bot nişanı və identifikatorunuz lazımdır (onu, məsələn, buradan əldə edə bilərsiniz
Python hazırlığı
Botu işə salmaq üçün kitabxanadan istifadə edəcəyik telebot
(pip install pytelegrambotapi
). Kitabxanadan istifadə subprocess
serverdə əmrləri yerinə yetirəcəyik.
Botun işə salınması
Serverdə bot.py faylı yaradın:
nano bot.py
Və kodu ona yapışdırın:
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)#в случае падения
Biz onun içindəki bot nişanını @BotFather tərəfindən buraxılmış, user_id isə hesabınızın id dəyəri ilə əvəz edirik. İstifadəçi identifikatorunu yoxlamaq lazımdır ki, bot serverinizə yalnız sizə girişi təmin etsin. Funksiya check_output()
verilən əmri yerinə yetirir və nəticəni qaytarır.
Yalnız botu işə salmaq qalır. Serverdə işləyən proseslər üçün istifadə etməyi üstün tuturam screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(burada "ServerBot" proses identifikatorudur)
Proses avtomatik olaraq arxa planda işləyəcək. Gəlin botla dialoqa gedək və hər şeyin lazım olduğu kimi işlədiyini yoxlayaq:
Təbrik edirik! Bot ona göndərilən əmrləri yerinə yetirir. İndi serverə daxil olmaq üçün sadəcə botla dialoq açmaq lazımdır.
Əmr təkrarı
Çox vaxt serverin vəziyyətini izləmək üçün eyni əmrləri yerinə yetirməlisiniz. Buna görə də, onları təkrar göndərmədən təkrar əmrlərin həyata keçirilməsi çox yersiz olacaqdır.
Mesajların altındakı daxili düymələrdən istifadə edərək bunu həyata keçirəcəyik:
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)#в случае падения
Botun yenidən işə salınması:
killall python3
screen -dmS ServerBot python3 bot.py
Hər şeyin düzgün işlədiyini bir daha yoxlayaq:
Mesajın altındakı düyməni sıxmaqla, bot bu mesajın göndərildiyi əmri təkrar etməlidir.
Bunun əvəzinə bir nəticəyə
Əlbəttə ki, bu üsul klassik əlaqə üsullarını əvəz etmir, lakin bu, serverin vəziyyətini tez bir zamanda öyrənməyə və ona mürəkkəb çıxış tələb etməyən əmrlər göndərməyə imkan verir.
Mənbə: www.habr.com