Üsna sageli tuleb ette olukordi, kus ligipääsu serverile on vaja siin ja praegu. SSH kaudu ühenduse loomine ei ole aga alati kõige mugavam viis, sest sul ei pruugi käepärast olla SSH klienti, serveri aadressi ega kasutaja/parooli kombinatsiooni. Muidugi on
Seega otsustasin rakendada lihtsa, kuid huvitava lahenduse. Nimelt kirjutada Telegrami bot, mis serveris endas käivitades täidab talle saadetud käsud ja tagastab tulemuse. Olles õppinud
Rakendasin selle projekti Ubuntu 16.04-s, kuid probleemideta töötamiseks teistes distributsioonides püüdsin kõike teha üldiselt.
Boti registreerimine
Registreerige @BotFatheriga uus robot. Saadame ta /newbot
ja edasi tekstis. Vajame uut bot-märki ja teie ID-d (saate selle hankida näiteks aadressilt
Pythoni ettevalmistus
Boti käivitamiseks kasutame raamatukogu telebot
(pip install pytelegrambotapi
). Raamatukogu kasutamine subprocess
täidame serveris käske.
Boti käivitamine
Looge serveris fail bot.py:
nano bot.py
Ja kleepige kood sinna:
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)#в случае падения
Asendame selles oleva boti märgiga @BotFather väljastatavaga ja user_id teie konto ID väärtusega. Kasutaja ID kontrollimine on vajalik, et robot võimaldaks juurdepääsu teie serverile ainult teile. Funktsioon check_output()
täidab antud käsu ja tagastab tulemuse.
Jääb vaid robot käivitada. Serveris protsesside käitamiseks eelistan kasutada screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(kus "ServerBot" on protsessi ID)
Protsess käivitub automaatselt taustal. Lähme dialoogi robotiga ja kontrollime, kas kõik töötab nii, nagu peab:
Palju õnne! Bot täidab talle saadetud käsud. Nüüd peate serverile juurdepääsuks lihtsalt avama dialoogi robotiga.
Käskude kordamine
Sageli peate serveri oleku jälgimiseks täitma samu käske. Seetõttu on korduvate käskude rakendamine ilma neid uuesti saatmata väga kohatu.
Rakendame selle sõnumite all olevate siseste nuppude abil:
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)#в случае падения
Boti taaskäivitamine:
killall python3
screen -dmS ServerBot python3 bot.py
Kontrollime uuesti, kas kõik töötab õigesti:
Vajutades sõnumi all olevat nuppu, peab bot kordama käsku, millest see teade saadeti.
Selle asemel, et järeldus
Loomulikult ei pretendeeri see meetod klassikaliste ühendusmeetodite asendusena, kuid võimaldab teil kiiresti teada saada serveri oleku ja saata sellele käske, mis ei vaja keerulist väljundit.
Allikas: www.habr.com