Мұнда және қазір серверге кіру қажет болған жағдайлар жиі кездеседі. Дегенмен, SSH арқылы қосылу әрқашан ең қолайлы әдіс бола бермейді, себебі қолыңызда SSH клиенті, сервер мекенжайы немесе пайдаланушы/құпия сөз тіркесімі болмауы мүмкін. Әрине бар
Сондықтан мен қарапайым, бірақ қызықты шешімді енгізуді шештім. Атап айтқанда, серверде іске қосылған кезде оған жіберілген командаларды орындап, нәтижені қайтаратын Telegram ботын жазу. Оқыған
Мен бұл жобаны Ubuntu 16.04 жүйесінде жүзеге асырдым, бірақ басқа дистрибутивтерде қиындықсыз жұмыс істеу үшін мен бәрін жалпы түрде жасауға тырыстым.
Ботты тіркеу
@BotFather арқылы жаңа ботты тіркеңіз. Біз оны жібереміз /newbot
және одан әрі мәтінде. Бізге жаңа бот таңбалауышы және сіздің идентификаторыңыз қажет болады (сіз оны, мысалы,
Python дайындығы
Ботты іске қосу үшін біз кітапхананы пайдаланамыз 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