Często zdarzają się sytuacje, w których dostęp do serwera jest potrzebny tu i teraz. Jednak nie zawsze połączenie przez SSH jest najdogodniejszym sposobem, ponieważ pod ręką może nie być klienta SSH, adresu serwera lub kombinacji „użytkownik/hasło”. Oczywiście, jest , który ułatwia administrację, ale również nie daje natychmiastowego dostępu.
Dlatego postanowiłem zrealizować proste, ale ciekawe rozwiązanie. Mianowicie – napisać bota Telegram, który uruchomiając się na samym serwerze, będzie wykonywał przysyłane mu polecenia i zwracał wyniki. Po przebadaniu tego tematu, zrozumiałem, że takie realizacje nie były dotąd opisane.
Ten projekt realizowałem na Ubuntu 16.04, ale aby umożliwić bezproblemowe uruchomienie na innych dystrybucjach, starałem się zrobić wszystko w ogólnej formie.
Rejestracja bota
Rejestrujemy nowego bota u @BotFather. Wysyłamy mu /newbot i dalej według tekstu. Będziemy potrzebować tokenu nowego bota oraz swojego id (można je uzyskać np. u ).
Przygotowanie Pythona
Do uruchomienia bota użyjemy biblioteki telebot (pip install pytelegrambotapi). Za pomocą biblioteki subprocess będziemy wykonywać polecenia na serwerze.
Uruchomienie bota
Na serwerze tworzymy plik bot.py:
nano bot.py
I wklejamy do niego kod:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token bota
user_id = 0 #id twojego konta
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #sprawdzamy, czy pisze właściciel
comand = message.text #tekst wiadomości
try: #jeśli polecenie nie jest wykonalne - check_output zgłosi wyjątek
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Nieprawidłowe dane wejściowe") #jeśli polecenie jest niepoprawne
if __name__ == '__main__':
while True:
try:#dodajemy try dla ciągłej pracy
bot.polling(none_stop=True)#uruchomienie bota
except:
time.sleep(10)#w przypadku błędu
Zamieniamy w nim token bota na ten, który wydał @BotFather, a user_id — na wartość id twojego konta. Sprawdzenie id użytkownika jest potrzebne, aby bot udostępniał dostęp do twojego serwera tylko tobie. Funkcja check_output() wykonuje przekazane polecenie i zwraca wynik.
Pozostało tylko uruchomić bota. Do uruchamiania procesów na serwerze wolę używać screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(gdzie „ServerBot” to identyfikator procesu)
Proces automatycznie uruchomi się w tle. Przejdźmy do rozmowy z botem i sprawdźmy, czy wszystko działa jak należy:

Gratulacje! Bot wykonuje przesyłane mu polecenia. Teraz, aby uzyskać dostęp do serwera, wystarczy otworzyć rozmowę z botem.
Powtarzanie poleceń
Często, aby monitorować stan serwera, trzeba wykonywać te same polecenia. Dlatego realizacja powtarzania poleceń bez ich ponownego wysyłania będzie bardzo przydatna.
Zrealizujemy to przy pomocy przycisków inline pod wiadomościami:
from subprocess import check_output
import telebot
from telebot import types # Dodajemy import przycisków
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") # Token bota
user_id = 0 # id twojego konta
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): # sprawdzamy, czy pisze właściciel
comand = message.text # tekst wiadomości
markup = types.InlineKeyboardMarkup() # tworzymy klawiaturę
button = types.InlineKeyboardButton(text="Powtórz", callback_data=comand) # tworzymy przycisk
markup.add(button) # dodajemy przycisk do klawiatury
try: # jeśli polecenie jest niewykonywalne - check_output zgłosi wyjątek
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) # wywołujemy polecenie i wysyłamy wiadomość z wynikiem
except:
bot.send_message(user_id, "Nieprawidłowe dane wejściowe") # jeśli polecenie jest niepoprawne
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data # odczytujemy polecenie z pola data przycisku
try:# jeśli polecenie nie jest wykonywalne - check_output zgłosi wyjątek
markup = types.InlineKeyboardMarkup() # tworzymy klawiaturę
button = types.InlineKeyboardButton(text="Powtórz", callback_data=comand) # tworzymy przycisk i w data podajemy polecenie
markup.add(button) # dodajemy przycisk do klawiatury
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) # wywołujemy polecenie i wysyłamy wiadomość z wynikiem
except:
bot.send_message(user_id, "Nieprawidłowe dane wejściowe") # jeśli polecenie jest niepoprawne
if __name__ == '__main__':
while True:
try:# dodajemy try dla nieprzerwanej pracy
bot.polling(none_stop=True)# uruchamiamy bota
except:
time.sleep(10)# w przypadku awarii
Restartujemy bota:
killall python3
screen -dmS ServerBot python3 bot.py
Ponownie sprawdzimy, czy wszystko działa poprawnie:

Po naciśnięciu przycisku pod wiadomością bot powinien powtórzyć polecenie, od którego ta wiadomość została wysłana.
Zamiast zakończenia
Bez wątpienia, ta metoda nie ma na celu zastąpienia klasycznych sposobów łączenia, jednak umożliwia stosunkowo szybkie uzyskanie informacji o stanie serwera i wysłanie mu poleceń, które nie wymagają skomplikowanego wyjścia.
Źródło: habr.com
