Pogosto se zgodijo situacije, ko je dostop do strežnika potreben takoj. Vendar pa povezava prek SSH ni vedno najbolj priročen način, saj morda ne bo na voljo SSH odjemalca, naslova strežnika ali kombinacije "uporabnik/pasword". Seveda, obstaja , ki poenostavi upravljanje, vendar pa tudi ne omogoča takojšnjega dostopa.
Zato sem se odločil, da uresničim preprosto, a zanimivo rešitev. Napisal sem Telegram bota, ki, začenši na strežniku, izvaja ukaze, ki mu jih pošljemo, in vrača rezultate. Po pregledu na to temo, sem ugotovil, da takšnih implementacij še nihče ni opisal.
Ta projekt sem izvajal na Ubuntu 16.04, vendar sem poskušal vse narediti v splošni obliki, da bo brez težav delovalo na drugih distribucijah.
Registracija bota
Registriramo novega bota pri @BotFather. Pošljemo mu /newbot nadaljujemo po besedilu. Potrebovali bomo token novega bota in vaš id (dobite ga lahko, na primer, pri ).
Priprava Pythona
Za zagon bota bomo uporabljali knjižnico telebot (pip install pytelegrambotapi). S knjižnico subprocess bomo izvajali ukaze na strežniku.
Zagon bota
Na strežniku ustvarimo datoteko bot.py:
nano bot.py
In vanjo prilepimo kodo:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token bota
user_id = 0 #id vašega računa
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #preverimo, ali piše prav lastnik
komand = message.text #besedilo sporočila
try: #če uka ni mogoče izvesti - check_output obiskal bo izjemo
bot.send_message(message.chat.id, check_output(komand, shell = True))
except:
bot.send_message(message.chat.id, "Neveljaven vnos") #če je ukaz napačen
if __name__ == '__main__':
while True:
try:#dodajamo try za nemoteno delovanje
bot.polling(none_stop=True)#zagon bota
except:
time.sleep(10)#v primeru padca
Zamenjamo token bota s tistim, ki ga je izdal @BotFather, in user_id z vrednostjo id vašega računa. Preverjanje id uporabnika je potrebno, da bot omogoča dostop do vašega strežnika le vam. Funkcija check_output() izvrši posredovan ukaz in vrne rezultat.
Ostalo je le še zagnati bota. Za zagon procesov na strežniku raje uporabljam screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(kjer je "ServerBot" identifikator procesa)
Postopek se bo samodejno zagnal v ozadju. Poglejmo z botom in preverimo, ali vse deluje, kot je treba:

Čestitamo! Bot izvaja ukaze, ki jih prejme. Zdaj, da pridobite dostop do strežnika, je dovolj, da odprete dialog z botom.
Ponovitev ukazov
Pogosto je potrebno za spremljanje stanja strežnika izvajati iste ukaze. Zato bo zelo koristna implementacija ponavljanja ukazov brez ponovnega pošiljanja.
Izvajali bomo s pomočjo inline gumbov pod sporočili:
from subprocess import check_output
import telebot
from telebot import types #Dodajamo uvoz gumbov
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token bota
user_id = 0 #id vašega računa
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #preverimo, da piše lastnik
comand = message.text #besedilo sporočila
markup = types.InlineKeyboardMarkup() #ustvarimo tipkovnico
button = types.InlineKeyboardButton(text="Ponovi", callback_data=comand) #ustvarimo gumb
markup.add(button) #dodamo gumb v tipkovnico
try: #če ukaz ni izvedljiv, bo check_output vrnil izjemo
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) #izvedemo ukaz in pošljemo sporočilo z rezultatom
except:
bot.send_message(user_id, "Neveljavna vnos") #če je ukaz nepravilen
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data #preberemo ukaz iz polja gumb data
try:#če ukaz ni izvedljiv, bo check_output vrnil izjemo
markup = types.InlineKeyboardMarkup() #ustvarimo tipkovnico
button = types.InlineKeyboardButton(text="Ponovi", callback_data=comand) #ustvarimo gumb in v data posredujemo ukaz
markup.add(button) #dodamo gumb v tipkovnico
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #izvedemo ukaz in pošljemo sporočilo z rezultatom
except:
bot.send_message(user_id, "Neveljavna vnos") #če je ukaz nepravilen
if __name__ == '__main__':
while True:
try:#dodamo poskus za nemoteno delovanje
bot.polling(none_stop=True)#zaženemo bota
except:
time.sleep(10)#v primeru izpada
Ponovno zagnamo bota:
killall python3
screen -dmS ServerBot python3 bot.py
Še enkrat preverimo, ali vse deluje pravilno:

Ob pritisku na gumb pod sporočilom mora bot ponoviti ukaz, zaradi katerega je bilo to sporočilo poslano.
Namesto zaključka
Seveda, ta metoda ne more nadomestiti klasičnih načinov povezave, vendar omogoča precej hitro pridobitev informacij o stanju strežnika ter pošiljanje ukazov, ki ne zahtevajo zapletenega izhoda.
Izvor: habr.com
