Često se javljaju situacije kada je pristup serveru potreban odmah. Međutim, povezivanje putem SSH nije uvijek najprikladniji način, jer možda nemamo SSH klijenta, adresu servera ili korisničko ime/lozinku. Naravno, postoji , što pojednostavljuje administraciju, ali ne pruža trenutni pristup.
Stoga sam odlučio implementirati jednostavno, ali zanimljivo rešenje. Naime, napisati Telegram bota koji će, pokrećući se na samom serveru, izvršavati mu poslate komande i vraćati rezultate. Proučavajući o ovoj temi, shvatio sam da niko nije opisao slične implementacije.
Ovaj projekat sam realizovao na Ubuntu 16.04, ali da bi bez problema mogao da radi na drugim distribucijama, trudim se da sve bude opšte.
Registracija bota
Registrujemo novog bota kod @BotFather. Šaljemo mu /newbot i dalje po tekstu. Biće nam potrebni token novog bota i vaš id (možete ga dobiti, na primer, kod ).
Priprema Python-a
Za pokretanje bota koristimo biblioteku telebot (pip install pytelegrambotapi). Pomoću biblioteke subprocess izvršićemo komande na serveru.
Pokretanje bota
Na serveru kreiramo datoteku bot.py:
nano bot.py
I umetnemo u nju kod:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token bota
user_id = 0 #id vašeg računa
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #proveravamo da li piše upravo vlasnik
comand = message.text #tekst poruke
try: #ako je komanda neizvršna - check_output će izazvati izuzetak
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Nevalidan unos") #ako je komanda netačna
if __name__ == '__main__':
while True:
try:#dodajemo try za neprekidno funkcionisanje
bot.polling(none_stop=True)#pokretanje bota
except:
time.sleep(10)#u slučaju pada
Zamenjujemo u njemu token bota onim koji je izdao @BotFather, i user_id — na vrednost id vašeg računa. Provera id korisnika je potrebna kako bi bot omogućavao pristup vašem serveru samo vama. Funkcija check_output() izvršava poslatu komandu i vraća rezultat.
Preostaje samo da pokrenemo bota. Za pokretanje procesa na serveru preferiram da koristim screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(gde je 'ServerBot' — identifikator procesa)
Proces će se automatski pokrenuti u pozadini. Pređimo na razgovor s botom i provjerimo radi li sve kako treba:

Čestitam! Bot izvršava poslane mu naredbe. Sada, kako biste dobili pristup serveru, dovoljno je otvoriti razgovor s botom.
Ponavljanje naredbi
Često je potrebno izvršavati iste naredbe za praćenje stanja servera. Stoga bi implementacija ponavljanja naredbi bez ponovnog slanja bila vrlo korisna.
Provodićemo pomoću inline tipki ispod poruka:
from subprocess import check_output
import telebot
from telebot import types #Dodajemo unos tipki
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token bota
user_id = 0 #id vašeg računa
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #provjeravamo da li piše upravo vlasnik
comanda = message.text #tekst poruke
markup = types.InlineKeyboardMarkup() #kreiramo tipkovnicu
button = types.InlineKeyboardButton(text="Ponoviti", callback_data=comanda) #kreiramo tipku
markup.add(button) #dodajemo tipku u tipkovnicu
try: #ako naredba nije izvediva - check_output će izbaciti iznimku
bot.send_message(user_id, check_output(comanda, shell = True, reply_markup = markup)) #izvode naredbu i šaljemo poruku s rezultatom
except:
bot.send_message(user_id, "Neispravan unos") #ako je naredba netočna
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comanda = call.data #čitamo naredbu iz polja tipke data
try:#ako naredba nije izvediva - check_output će izbaciti iznimku
markup = types.InlineKeyboardMarkup() #kreiramo tipkovnicu
button = types.InlineKeyboardButton(text="Ponoviti", callback_data=comanda) #kreiramo tipku i u data šaljemo naredbu
markup.add(button) #dodajemo tipku u tipkovnicu
bot.send_message(user_id, check_output(comanda, shell = True), reply_markup = markup) #izvodimo naredbu i šaljemo poruku s rezultatom
except:
bot.send_message(user_id, "Neispravan unos") #ako je naredba netočna
if __name__ == '__main__':
while True:
try:#dodajemo try za neprekidno djelovanje
bot.polling(none_stop=True)#pokrećemo bota
except:
time.sleep(10)#u slučaju pada
Ponovno pokrećemo bota:
killall python3
screen -dmS ServerBot python3 bot.py
Ponovno provjeravamo radi li sve ispravno:

Pri pritiskanju tipke ispod poruke bot bi trebao ponoviti naredbu na temelju koje je ta poruka poslana.
Umjesto zaključka
Naravno, ova metoda ne pretendira zamijeniti klasične načine povezivanja, međutim, omogućava relativno brzo saznanje o stanju servera i slanje mu naredbi koje ne zahtijevaju složeno ispisivanje.
Izvor: habr.com
