Tihti esinevad olukorrad, kus serverisse on vajalik juurdepääs kohe ja praegu. Kuid mitte alati ei ole SSH-ühendus kõige mugavam, sest käsutuses võib mitte olla SSH-klienti, serveri aadressi või kasutaja/parooli kombinatsiooni. Muidugi, on olemas , mis lihtsustab haldamist, kuid see ei paku ka kohest juurdepääsu.
Seetõttu otsustasin rakendada lihtsat, kuid huvitavat lahendust. Nimelt — kirjutada Telegram-boti, mis, käivitades serveris, täidab talle saadetud käske ning tagastab tulemuse. Uurides selle teema kohta, sain aru, et sarnaseid teostusi pole veel keegi kirjeldanud.
Selle projekti teostasin Ubuntu 16.04-l, kuid probleemideta käivitamiseks teistel distributsioonidel püüdsin teha kõik üldiselt.
Boti registreerimine
Registreerime uue boti @BotFather juures. Saadame talle /newbot ja edasi tekstis. Meile on vajalik uue boti token ja teie id (seda saab näiteks @userinfobot'ilt). ).
Python'i ettevalmistamine
Boti käitamiseks kasutame teeki telebot (pip install pytelegrambotapi). Teegi subprocess kasutame serveri käskude täitmiseks.
Boti käivitamine
Serveris loome faili bot.py:
nano bot.py
Ja sisestame sellesse koodi:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#boti token
user_id = 0 #teie konto id
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #kontrollime, kas kirjutas tõepoolest omanik
comand = message.text #sõnumi tekst
try: #kui käsk ei ole täidetav - check_output annab välja erandi
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Kehtetu sisend") #kui käsk on vale
if __name__ == '__main__':
while True:
try:#lisame try, et tööd oleks katkematu
bot.polling(none_stop=True)#boti käivitamine
except:
time.sleep(10)#kui toimus tõrge
Asendame selles boti token'i selle, mille andis @BotFather, ja user_id — teie konto id väärtusega. Kasutaja id kontrollimine on vajalik, et bot annaks juurdepääsu teie serverile ainult teile. Funktsioon check_output() täidab edastatud käsu ja tagastab tulemuse.
Vajab ainult boti käivitamist. Protsesside käivitamiseks serveris eelistan kasutada screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(kus „ServerBot” on protsessi identifikaator)
Protsess käivitub automaatselt taustal. Liigume vestluses boti juurde ja kontrollime, et kõik töötab õigesti:

Palju õnne! Bot täidab talle saadetud käske. Nüüd, et serverisse juurde pääseda, piisab, kui avada vestlus botiga.
Käskude kordamine
Tihti tuleb serveri seisundi jälgimiseks täita samu käske. Seetõttu on käskude kordamise rakendamine ilma nende uuesti saatmiseta väga vajalik.
Rakendame seda inline-nuppude abil sõnumite all:
from subprocess import check_output
import telebot
from telebot import types # Lisame nupud
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") # Boti token
user_id = 0 # teie konto id
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): # kontrollime, et kirjutab just omanik
comand = message.text # sõnumi tekst
markup = types.InlineKeyboardMarkup() # loome klaviatuuri
button = types.InlineKeyboardButton(text="Korrata", callback_data=comand) # loome nupu
markup.add(button) # lisame nupu klaviatuuri
try: # kui käsk ei ole teostatav - check_output viskab erandi
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) # kutsume käsku ja saadame sõnumi tulemusega
except:
bot.send_message(user_id, "Vale sisend") # kui käsk on vale
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data # loeme käsu nupu andmeväljast
try: # kui käsk ei ole teostatav - check_output viskab erandi
markup = types.InlineKeyboardMarkup() # loome klaviatuuri
button = types.InlineKeyboardButton(text="Korrata", callback_data=comand) # loome nupu ja andmeväljas anname käsu
markup.add(button) # lisame nupu klaviatuuri
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) # kutsume käsku ja saadame sõnumi tulemusega
except:
bot.send_message(user_id, "Vale sisend") # kui käsk on vale
if __name__ == '__main__':
while True:
try: # lisame try pideva töö tagamiseks
bot.polling(none_stop=True) # käivitame boti
except:
time.sleep(10) # juhul kui see kukub
Taaskäivitame boti:
killall python3
screen -dmS ServerBot python3 bot.py
Kontrollime jälle, et kõik töötab õigesti:

Nupu vajutamisel bot peaks kordama käsku, millest see sõnum saadeti.
Lõpetuseks
Ilmselgelt ei saa see meetod klassikaliste ühendusmeetodite asenduseks, kuid see võimaldab küllaltki kiiresti teada saada serveri seisundist ja saata sellele käske, mis ei nõua keerulist väljundit.
Allikas: habr.com
