Gana dažnai pasitaiko situacijų, kai prieiti prie serverio reikia čia ir dabar. Tačiau prisijungimas per SSH ne visada yra patogiausias būdas, nes po ranka galite neturėti SSH kliento, serverio adreso ar vartotojo/slaptažodžio derinio. Žinoma turi
Taigi nusprendžiau įgyvendinti paprastą, bet įdomų sprendimą. Būtent parašyti Telegram botą, kuris paleistas pačiame serveryje vykdys jam siunčiamas komandas ir grąžins rezultatą. Išmokęs
Įgyvendinau šį projektą Ubuntu 16.04 versijoje, tačiau, kad kitose distribucijose veiktų be problemų, bandžiau viską padaryti bendrai.
Botų registracija
Užregistruokite naują robotą su @BotFather. Mes jį siunčiame /newbot
ir toliau tekste. Mums reikės naujo roboto prieigos rakto ir jūsų ID (jį galite gauti, pavyzdžiui, iš
Python paruošimas
Norėdami paleisti robotą, naudosime biblioteką telebot
(pip install pytelegrambotapi
). Naudojimasis biblioteka subprocess
vykdysime komandas serveryje.
Boto paleidimas
Sukurkite bot.py failą serveryje:
nano bot.py
Ir įklijuokite kodą į jį:
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)#в случае падения
Jame esantį roboto prieigos raktą pakeičiame @BotFather išduotu, o user_id - jūsų paskyros ID verte. Patikrinti vartotojo ID reikia, kad robotas suteiktų prieigą prie jūsų serverio tik jums. Funkcija check_output()
įvykdo duotą komandą ir grąžina rezultatą.
Belieka tik paleisti robotą. Norėdami paleisti procesus serveryje, norėčiau naudoti screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(kur „ServerBot“ yra proceso ID)
Procesas bus automatiškai paleistas fone. Pereikime prie dialogo su robotu ir patikrinkime, ar viskas veikia taip, kaip turėtų:
Sveikiname! Botas vykdo jam siunčiamas komandas. Dabar, norėdami pasiekti serverį, tereikia pradėti dialogą su robotu.
Komandos kartojimas
Dažnai norėdami stebėti serverio būseną, turite vykdyti tas pačias komandas. Todėl pasikartojančių komandų įgyvendinimas jų nesiunčiant iš naujo bus labai netinkamas.
Ją įgyvendinsime naudodami eilutinius mygtukus po pranešimais:
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)#в случае падения
Boto paleidimas iš naujo:
killall python3
screen -dmS ServerBot python3 bot.py
Dar kartą patikrinkime, ar viskas veikia tinkamai:
Paspaudus mygtuką po pranešimu, robotas turi pakartoti komandą, iš kurios buvo išsiųstas šis pranešimas.
Vietoj išvados
Žinoma, šis metodas nepretenduoja į klasikinių prisijungimo būdų pakaitalą, tačiau leidžia greitai sužinoti apie serverio būseną ir siųsti jam komandas, kurioms nereikia sudėtingos išvesties.
Šaltinis: www.habr.com