Sageli esinevad olukorrad, kus juurdepääs serverile on vajalik kohe. Siiski ei pruugi SSH kaudu ühendamine alati olla kõige mugavam viis, kuna käepärast ei pruugi olla SSH kliendi, serveri aadressi või „kasutaja/parooli” komplekti. Muidugi, on olemas , mis lihtsustab haldamist, kuid see ei paku ka kohevat juurdepääsu.
Seetõttu otsustasin rakendada lihtsat, kuid huvitavat lahendust. Nimelt — kirjutada Telegrami-bot, mis, käivitades serveris, täidab saadetud käsklusi ja tagastab tulemuse. Uurides selle teema kohta, sain aru, et keegi polnud sarnaseid lahendusi veel kirjeldanud.
Selle projekti realiseerisin Ubuntu 16.04-l, kuid sujuva käivitamise tagamiseks teistel distributsioonidel püüdsin teha kõik üldiselt.
Boti registreerimine
Registreerime uue boti @BotFather juures. Saadame talle /newbot ja edasi vastavalt tekstile. Me vajame uue boti tokenit ja teie id-d (saab selle näiteks ).
saamisega).
Pythoni ettevalmistamine Boti käivitamiseks kasutame teeki (telebotpip install pytelegrambotapi ). Teegi abil subprocess
täidame serveril käske.
Boti käivitamine
nano bot.py
Ja kleepime 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, et kirjutab tõeliselt omanik
command = message.text #sõnumi tekst
try: #kui käsk ei ole teostatav - check_output viskab erandi
bot.send_message(message.chat.id, check_output(command, shell = True))
except:
bot.send_message(message.chat.id, "Vale sisend") #kui käsk on vale
if __name__ == '__main__':
while True:
try:#lisame try, et tagada katkestusteta töö
bot.polling(none_stop=True)#bot käivitamine
except:
time.sleep(10)#kukkumise korral
Asendame selles boti tokeni selle, mille andis @BotFather, ja user_id — teie konto id väärtusega. Kasutaja id kontroll on vajalik, et bot annaks juurdepääsu teie serverile ainult teile. Funktsioon check_output() täidab edastatud käsu ja tagastab tulemuse.
Küsimiseks jääb ainult bot käivitamine. Protsesside käivitamiseks serveris eelistan kasutada ekraan (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(kus „ServerBot“ on protsessi identifikaator)
Protsess käivitub automaatselt taustal. Liigume vestlusesse robotiga ja kontrollime, et kõik töötab nagu peab:

Palju õnne! Robot täidab saadetud käske. Nüüd piisab serverisse pääsemiseks, kui avate vestluse robotiga.
Käskude kordamine
Sageli tuleb serveri seisundi jälgimiseks täita samu käske mitu korda. Seega on käsu kordamise rakendamine ilma nende uuesti saatmiseta väga kasulik.
Rakendame seda inline-nuppude abil sõnumite all:
from subprocess import check_output
import telebot
from telebot import types # Lisa klahve import
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 just omanik kirjutab
comand = message.text # sõnumiteksti
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 nuppu andmest
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 edastame andmes 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 proovimise, et töö oleks katkematu
bot.polling(none_stop=True) # käivitame boti
except:
time.sleep(10) # tõrke korral
Taaskäivitame boti:
killall python3
screen -dmS ServerBot python3 bot.py
Kontrollime jälle, et kõik töötab õigesti:

Sõnumi all oleva nupu vajutamisel peab bot kordama käsku, mille saatmine käivitas selle sõnumi.
Kokkuvõtte asemel
Ilmselgelt ei pretendeeri see meetod klassikaliste ühendusviiside asendamisele, kuid võimaldab kiiresti saada teavet serveri oleku kohta ja saata sellele käske, mis ei nõua keerulist väljundit.
Allikas: habr.com
