Toegang tot Linux-server met behulp van Telegram-bot in Python

Heel vaak zijn er situaties waarin hier en nu toegang tot de server nodig is. Verbinden via SSH is echter niet altijd de handigste manier, omdat je misschien geen SSH-client, serveradres of gebruiker/wachtwoord-combinatie bij de hand hebt. Natuurlijk hebben Webmin, wat het beheer vereenvoudigt, maar het biedt ook geen directe toegang.

Dus besloot ik een eenvoudige maar interessante oplossing te implementeren. Namelijk om een ​​Telegram-bot te schrijven die, wanneer hij op de server zelf wordt gelanceerd, de opdrachten uitvoert die ernaar worden verzonden en het resultaat retourneert. Na gestudeerd te hebben verscheidene artikels over dit onderwerp realiseerde ik me dat nog niemand dergelijke implementaties heeft beschreven.

Ik heb dit project geΓ―mplementeerd op Ubuntu 16.04, maar voor een probleemloze werking op andere distributies heb ik geprobeerd alles op een algemene manier te maken.

Bot-registratie

Registreer een nieuwe bot bij @BotFather. Wij sturen hem /newbot en verder in de tekst. We hebben een nieuw bot-token en uw id nodig (u kunt deze bijvoorbeeld krijgen van @gebruikersinfobot).

Python-voorbereiding

Om de bot uit te voeren, gebruiken we de bibliotheek telebot (pip install pytelegrambotapi). De bibliotheek gebruiken subprocess we zullen commando's uitvoeren op de server.

Bot-lancering

Maak een bot.py-bestand op de server:
nano bot.py

En plak de code erin:

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)#Π² случаС падСния

We vervangen het bot-token erin door het token dat is uitgegeven door @BotFather en user_id door de id-waarde van uw account. Het controleren van de gebruikers-ID is nodig, zodat de bot alleen u toegang geeft tot uw server. Functie check_output() voert de gegeven opdracht uit en retourneert het resultaat.

Het blijft alleen om de bot te starten. Voor lopende processen op de server gebruik ik het liefst screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(waarbij "ServerBot" de proces-ID is)

Het proces wordt automatisch op de achtergrond uitgevoerd. Laten we naar de dialoog met de bot gaan en controleren of alles werkt zoals het hoort:

Toegang tot Linux-server met behulp van Telegram-bot in Python

Gefeliciteerd! De bot voert de opdrachten uit die eraan zijn verzonden. Om toegang te krijgen tot de server, hoeft u alleen maar een dialoog met de bot te openen.

Commando herhaling

Om de status van de server te bewaken, moet u vaak dezelfde opdrachten uitvoeren. Daarom zal de implementatie van herhalende opdrachten zonder ze opnieuw te verzenden erg misplaatst zijn.

We zullen het implementeren met behulp van inline-knoppen onder de berichten:

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)#Π² случаС падСния

De bot opnieuw opstarten:

killall python3
screen -dmS ServerBot python3 bot.py

Laten we nogmaals controleren of alles correct werkt:

Toegang tot Linux-server met behulp van Telegram-bot in Python

Door op de knop onder het bericht te drukken, moet de bot het commando herhalen van waaruit dit bericht is verzonden.

In plaats Output

Deze methode pretendeert natuurlijk niet een vervanging te zijn voor de klassieke verbindingsmethoden, maar stelt u in staat om snel de status van de server te achterhalen en er opdrachten naar te sturen die geen complexe uitvoer vereisen.

Bron: www.habr.com

Voeg een reactie