Destul de des există situații în care accesul la server este necesar aici și acum. Cu toate acestea, conectarea prin SSH nu este întotdeauna cea mai convenabilă modalitate, deoarece este posibil să nu aveți un client SSH, o adresă de server sau o combinație de utilizator/parolă la îndemână. Desigur că au
Așa că am decis să implementez o soluție simplă, dar interesantă. Și anume, să scrie un bot Telegram care, atunci când este lansat pe serverul propriu-zis, va executa comenzile trimise acestuia și va returna rezultatul. După ce a studiat
Am implementat acest proiect pe Ubuntu 16.04, dar pentru o rulare fără probleme pe alte distribuții, am încercat să fac totul într-un mod general.
Înregistrarea botului
Înregistrați un bot nou cu @BotFather. Îl trimitem /newbot
și mai departe în text. Vom avea nevoie de un nou token bot și id-ul dvs. (îl puteți obține, de exemplu, de la
Pregătirea pitonului
Pentru a rula bot-ul, vom folosi biblioteca telebot
(pip install pytelegrambotapi
). Utilizarea Bibliotecii subprocess
vom executa comenzi pe server.
Lansare bot
Creați un fișier bot.py pe server:
nano bot.py
Și inserați codul în el:
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)#в случае падения
Înlocuim simbolul bot din acesta cu cel emis de @BotFather și user_id cu valoarea ID-ului contului tău. Este necesară verificarea ID-ului utilizatorului, astfel încât botul să vă ofere acces la serverul dvs. numai dvs. Funcţie check_output()
execută comanda dată și returnează rezultatul.
Rămâne doar să porniți botul. Pentru a rula procese pe server, prefer să folosesc screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(unde „ServerBot” este ID-ul procesului)
Procesul va rula automat în fundal. Să mergem la dialogul cu botul și să verificăm dacă totul funcționează așa cum ar trebui:
Felicitări! Botul execută comenzile trimise către acesta. Acum, pentru a accesa serverul, trebuie doar să deschideți un dialog cu botul.
Repetarea comenzilor
Adesea, pentru a monitoriza starea serverului, trebuie să executați aceleași comenzi. Prin urmare, implementarea comenzilor repetate fără a le retrimite va fi foarte deplasată.
O vom implementa folosind butoanele inline sub mesajele:
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)#в случае падения
Repornirea botului:
killall python3
screen -dmS ServerBot python3 bot.py
Să verificăm din nou dacă totul funcționează corect:
Apăsând butonul de sub mesaj, botul trebuie să repete comanda de la care a fost trimis acest mesaj.
În loc de concluzie
Desigur, această metodă nu se pretinde a fi un înlocuitor pentru metodele clasice de conectare, cu toate acestea, vă permite să aflați rapid despre starea serverului și să îi trimiteți comenzi care nu necesită o ieșire complexă.
Sursa: www.habr.com