Adesea apar situații în care accesul la server este necesar imediat. Totuși, conexiunea prin SSH nu este întotdeauna cea mai convenabilă soluție, deoarece poate să nu existe un client SSH, adresa serverului sau informațiile despre „utilizator/parolă”. Desigur, există , care simplifică administrarea, dar nu oferă acces instantaneu.
De aceea, am decis să implementez o soluție simplă, dar interesantă. Anume — să scriu un bot Telegram, care, fiind activat pe server, va executa comenzile trimise și va returna rezultatul. Studiază acest subiect, am realizat că nimeni nu a descris astfel de implementări.
Acest proiect l-am realizat pe Ubuntu 16.04, dar pentru a rula fără probleme pe alte distribuții, am încercat să fac totul într-un mod general.
Înregistrarea botului
Înregistrăm un nou bot la @BotFather. Îi trimitem /newbot și continuăm cu textul. Ne vor trebui tokenul noului bot și id-ul dvs. (îl puteți obține, de exemplu, de la ).
Pregătirea Python-ului
Pentru a rula botul, vom folosi biblioteca telebot (pip install pytelegrambotapi). Cu ajutorul bibliotecii subprocess vom executa comenzi pe server.
Pornirea botului
Pe server, creăm fișierul bot.py:
nano bot.py
Și inserăm codul:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#tokenul botului
user_id = 0 #id-ul contului dvs.
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #verificăm că scrie exact proprietarul
comand = message.text #textul mesajului
try: #dacă comanda nu este executabilă - check_output va genera o excepție
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Input invalid") #dacă comanda este greșită
if __name__ == '__main__':
while True:
try:#adăugăm try pentru funcționarea constantă
bot.polling(none_stop=True)#pornirea botului
except:
time.sleep(10)#în caz de cădere
Înlocuim tokenul botului cu cel pe care l-a dat @BotFather, iar user_id — cu valoarea id-ului contului dvs. Verificarea id-ului utilizatorului este necesară pentru ca botul să ofere acces la serverul dvs. doar dvs. Funcția check_output() execută comanda transmisă și returnează rezultatul.
Mai rămâne doar să pornim botul. Pentru a lansa procese pe server, prefer să folosesc screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(unde „ServerBot” este identifiantul procesului)
Procesul se va lansa automat în fundal. Să trecem în dialog cu botul și să verificăm dacă totul funcționează cum trebuie:

Felicitări! Botul execută comenzile primite. Acum, pentru a accesa serverul, este suficient 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 repetării comenzilor fără a le trimite din nou va fi foarte utilă.
Vom implementa acest lucru folosind butoane inline sub mesaje:
from subprocess import check_output
import telebot
from telebot import types # Adăugăm importul butoanelor
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") # Tokenul botului
user_id = 0 # id-ul contului dvs.
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): # verificăm dacă scrie chiar proprietarul
comand = message.text # textul mesajului
markup = types.InlineKeyboardMarkup() # creăm tastatura
button = types.InlineKeyboardButton(text="Repetă", callback_data=comand) # creăm butonul
markup.add(button) # adăugăm butonul în tastatură
try: # dacă comanda nu poate fi executată - check_output va genera o excepție
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) # apelăm comanda și trimitem un mesaj cu rezultatul
except:
bot.send_message(user_id, "Input invalid") # dacă comanda este incorectă
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data # citim comanda din câmpul datelor butonului
try: # dacă comanda nu poate fi executată - check_output va genera o excepție
markup = types.InlineKeyboardMarkup() # creăm tastatura
button = types.InlineKeyboardButton(text="Repetă", callback_data=comand) # creăm butonul și returnăm comanda în date
markup.add(button) # adăugăm butonul în tastatură
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) # apelăm comanda și trimitem un mesaj cu rezultatul
except:
bot.send_message(user_id, "Input invalid") # dacă comanda este incorectă
if __name__ == '__main__':
while True:
try: # adăugăm try pentru funcționarea continuă
bot.polling(none_stop=True) # lansăm botul
except:
time.sleep(10) # în caz de cădere
Repornim botul:
killall python3
screen -dmS ServerBot python3 bot.py
Să verificăm din nou dacă totul funcționează corect:

La apăsarea butonului de sub mesaj, botul ar trebui să repete comanda din care a fost trimis acest mesaj.
În concluzie
Desigur, această metodă nu pretinde să înlocuiască modalitățile clasice de conectare, totuși, permite să aflăm rapid starea serverului și să-i trimitem comenzi care nu necesită o ieșire complicată.
Sursa: habr.com
