Dość często zdarzają się sytuacje, kiedy dostęp do serwera jest potrzebny tu i teraz. Jednak połączenie przez SSH nie zawsze jest najwygodniejszym sposobem, ponieważ możesz nie mieć pod ręką klienta SSH, adresu serwera lub kombinacji użytkownika i hasła. Oczywiście, że mam
Postanowiłem więc wdrożyć proste, ale ciekawe rozwiązanie. Mianowicie napisać bota Telegrama, który po uruchomieniu na samym serwerze wykona wysłane do niego polecenia i zwróci wynik. Studiowałem
Zaimplementowałem ten projekt na Ubuntu 16.04, ale dla bezproblemowego działania na innych dystrybucjach starałem się zrobić wszystko w sposób ogólny.
Rejestracja bota
Zarejestruj nowego bota w @BotFather. Wysyłamy go /newbot
i dalej w tekście. Będziemy potrzebować nowego tokena bota oraz Twojego id (możesz go zdobyć np
Przygotowanie Pythona
Do uruchomienia bota użyjemy biblioteki telebot
(pip install pytelegrambotapi
). Korzystanie z Biblioteki subprocess
wykonamy polecenia na serwerze.
Uruchomienie bota
Utwórz plik bot.py na serwerze:
nano bot.py
I wklej do niego kod:
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)#в случае падения
Zamieniamy w nim token bota na ten wystawiony przez @BotFather, a user_id na wartość id Twojego konta. Sprawdzenie identyfikatora użytkownika jest potrzebne, aby bot zapewniał dostęp do Twojego serwera tylko Tobie. Funkcjonować check_output()
wykonuje podane polecenie i zwraca wynik.
Pozostaje 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 zostanie automatycznie uruchomiony w tle. Przejdźmy do dialogu z botem i sprawdźmy, czy wszystko działa tak, jak powinno:
Gratulacje! Bot wykonuje wysyłane do niego polecenia. Teraz, aby uzyskać dostęp do serwera, wystarczy otworzyć dialog z botem.
Powtórzenie polecenia
Często, aby monitorować stan serwera, musisz wykonać te same polecenia. Dlatego realizacja powtarzających się poleceń bez ich ponownego wysyłania będzie bardzo nie na miejscu.
Zaimplementujemy to za pomocą wbudowanych przycisków pod komunikatami:
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)#в случае падения
Restart bota:
killall python3
screen -dmS ServerBot python3 bot.py
Sprawdźmy jeszcze raz, czy wszystko działa poprawnie:
Naciskając przycisk pod wiadomością, bot musi powtórzyć polecenie, z którego ta wiadomość została wysłana.
Zamiast zawierania
Oczywiście ta metoda nie pretenduje do miana zamiennika klasycznych metod łączenia, jednak pozwala szybko dowiedzieć się o stanie serwera i wysłać do niego polecenia, które nie wymagają skomplikowanego wyjścia.
Źródło: www.habr.com