Vrlo često postoje situacije kada je pristup poslužitelju potreban ovdje i sada. Međutim, povezivanje putem SSH-a nije uvijek najprikladniji način jer možda nemate pri ruci SSH klijenta, adresu poslužitelja ili kombinaciju korisnika/lozinke. Naravno da jesu
Stoga sam odlučio implementirati jednostavno, ali zanimljivo rješenje. Naime, napisati Telegram bot koji će, kada se pokrene na samom serveru, izvršavati naredbe koje mu se šalju i vraćati rezultat. Proučivši
Implementirao sam ovaj projekt na Ubuntu 16.04, ali za nesmetan rad na drugim distribucijama, pokušao sam napraviti sve na općeniti način.
Registracija bota
Registrirajte novog bota s @BotFather. Mi ga šaljemo /newbot
i dalje u tekstu. Trebat će nam novi token bota i vaš ID (možete ga dobiti, na primjer, od
Python priprema
Za pokretanje bota koristit ćemo biblioteku telebot
(pip install pytelegrambotapi
). Korištenje knjižnice subprocess
mi ćemo izvršavati naredbe na poslužitelju.
Pokretanje bota
Napravite datoteku bot.py na poslužitelju:
nano bot.py
I zalijepite kod u njega:
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)#в случае падения
Token bota u njemu zamjenjujemo onim koji je izdao @BotFather, a user_id s id vrijednošću vašeg računa. Provjera korisničkog ID-a je potrebna kako bi bot omogućio pristup vašem poslužitelju samo vama. Funkcija check_output()
izvršava zadanu naredbu i vraća rezultat.
Ostaje samo pokrenuti bot. Za pokretanje procesa na poslužitelju radije koristim screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(gdje je "ServerBot" ID procesa)
Proces će se automatski pokrenuti u pozadini. Idemo u dijalog s botom i provjerimo radi li sve kako treba:
Čestitamo! Bot izvršava naredbe koje su mu poslane. Sada, da biste pristupili poslužitelju, samo trebate otvoriti dijalog s botom.
Ponavljanje naredbe
Često, da biste pratili stanje poslužitelja, morate izvršiti iste naredbe. Stoga će implementacija ponavljanja naredbi bez ponovnog slanja biti vrlo neprikladna.
Implementirat ćemo ga pomoću ugrađenih gumba ispod poruka:
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)#в случае падения
Ponovno pokretanje bota:
killall python3
screen -dmS ServerBot python3 bot.py
Provjerimo još jednom radi li sve ispravno:
Pritiskom na gumb ispod poruke bot mora ponoviti naredbu iz koje je ova poruka poslana.
Umjesto zaključka
Naravno, ova metoda ne pretendira biti zamjena za klasične metode povezivanja, ali vam omogućuje da brzo saznate o stanju poslužitelja i pošaljete mu naredbe koje ne zahtijevaju složen izlaz.
Izvor: www.habr.com