Često postoje situacije kada je pristup serveru potreban ovdje i sada. Međutim, povezivanje putem SSH-a nije uvijek najpogodniji način, jer možda nemate pri ruci SSH klijenta, adresu servera ili kombinaciju korisnika/lozinke. Naravno
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 su mu poslane i vraćati rezultat. Proučivši
Implementirao sam ovaj projekat na Ubuntu 16.04, ali za nesmetano pokretanje na drugim distribucijama, pokušao sam sve napraviti na opći način.
Registracija bota
Registrujte novog bota sa @BotFather. Šaljemo ga /newbot
i dalje u tekstu. Trebat će nam novi token bota i vaš ID (možete ga dobiti, na primjer, od
Priprema za Python
Za pokretanje bota koristit ćemo biblioteku telebot
(pip install pytelegrambotapi
). Korištenje biblioteke subprocess
izvršićemo komande na serveru.
Pokretanje bota
Kreirajte bot.py fajl na serveru:
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)#в случае падения
U njemu zamjenjujemo bot token onim koji je izdao @BotFather, a user_id vrijednošću id vašeg računa. Provjera korisničkog ID-a je potrebna kako bi bot omogućio pristup vašem serveru samo vama. Funkcija check_output()
izvršava zadatu naredbu i vraća rezultat.
Ostaje samo pokrenuti bot. Za pokretanje procesa na serveru 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 sa botom i provjerimo da li sve radi kako treba:
Čestitamo! Bot izvršava naredbe koje su mu poslane. Sada, da biste pristupili serveru, potrebno je samo da otvorite dijalog sa botom.
Ponavljanje komande
Često, da biste pratili stanje servera, morate izvršiti iste komande. Stoga će implementacija ponavljanja naredbi bez njihovog ponovnog slanja biti vrlo deplasirana.
Implementiraćemo ga pomoću ugrađenih dugmadi 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 da li sve radi kako treba:
Pritiskom na dugme ispod poruke bot mora ponoviti komandu sa koje je ova poruka poslata.
Umjesto zaključka
Naravno, ova metoda ne pretenduje da bude zamjena za klasične metode povezivanja, međutim, omogućava vam da brzo saznate o stanju servera i pošaljete mu naredbe koje ne zahtijevaju složeni izlaz.
izvor: www.habr.com