Sufiĉe ofte estas situacioj kiam aliro al la servilo estas necesa ĉi tie kaj nun. Tamen, konekti per SSH ne ĉiam estas la plej oportuna maniero, ĉar vi eble ne havas SSH-klienton, servilan adreson aŭ uzantan/pasvortan kombinaĵon ĉemane. Kompreneble havas
Do mi decidis efektivigi simplan sed interesan solvon. Nome, por skribi Telegram-boton, kiu, kiam ĝi estas lanĉita sur la servilo mem, ekzekutos la ordonojn senditajn al ĝi kaj redonos la rezulton. Studinte
Mi efektivigis ĉi tiun projekton sur Ubuntu 16.04, sed por senproblema funkciado en aliaj distribuoj, mi provis fari ĉion en ĝenerala maniero.
Bot-registrado
Registri novan bot kun @BotFather. Ni sendas lin /newbot
kaj plu en la teksto. Ni bezonos novan bot-ĵetonon kaj vian identigilon (vi povas akiri ĝin, ekzemple, de
Preparado de Python
Por ruli la bot, ni uzos la bibliotekon telebot
(pip install pytelegrambotapi
). Uzante la bibliotekon subprocess
ni ekzekutos komandojn sur la servilo.
Bot-lanĉo
Kreu bot.py-dosieron sur la servilo:
nano bot.py
Kaj algluu la kodon en ĝin:
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)#в случае падения
Ni anstataŭigas la bot-ĵetonon en ĝi per tiu eldonita de @BotFather, kaj user_id kun la id-valoro de via konto. Kontroli la uzantidentigilon necesas por ke la bot nur al vi ebligu aliron al via servilo. Funkcio check_output()
plenumas la donitan komandon kaj resendas la rezulton.
Restas nur komenci la bot. Por ruli procezojn sur la servilo, mi preferas uzi screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(kie "ServerBot" estas la proceza ID)
La procezo aŭtomate funkcios en la fono. Ni iru al la dialogo kun la bot kaj kontrolu, ke ĉio funkcias kiel ĝi devus:
Gratulon! La roboto plenumas la ordonojn senditajn al ĝi. Nun, por aliri la servilon, vi nur bezonas malfermi dialogon kun la bot.
Komanda ripeto
Ofte, por kontroli la staton de la servilo, vi devas ekzekuti la samajn komandojn. Tial, la efektivigo de ripetado de komandoj sen resendi ilin estos tre malloka.
Ni efektivigos ĝin uzante enliniajn butonojn sub la mesaĝoj:
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)#в случае падения
Rekomencante la bot:
killall python3
screen -dmS ServerBot python3 bot.py
Ni kontrolu denove, ke ĉio funkcias ĝuste:
Premante la butonon sub la mesaĝo, la bot devas ripeti la komandon de kiu ĉi tiu mesaĝo estis sendita.
Anstataŭ konkludo
Kompreneble, ĉi tiu metodo ne ŝajnigas esti anstataŭaĵo por la klasikaj konektmetodoj, tamen ĝi permesas vin rapide ekscii pri la stato de la servilo kaj sendi al ĝi komandojn, kiuj ne postulas kompleksan eligon.
fonto: www.habr.com