Acces la serverul linux printr-un bot Telegram pe Python

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ă Webmin, 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ă Voi menționa că nu ne referim la sharding, adică distribuirea datelor între diferite baze de date sau servere. Pentru că, chiar și împărțind datele pe articolele noastre 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 @userinfobot).

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:

Acces la serverul linux printr-un bot Telegram pe Python

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:

Acces la serverul linux printr-un bot Telegram pe Python

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

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster