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

Dikwels is daar situasies wanneer toegang tot die bediener hier en nou nodig is. Om via SSH te koppel is egter nie altyd die gerieflikste manier nie, want jy het dalk nie 'n SSH-kliΓ«nt, bedieneradres of gebruiker/wagwoord-kombinasie byderhand nie. Natuurlik het Webmin, wat administrasie vereenvoudig, maar dit bied ook nie onmiddellike toegang nie.

Daarom het ek besluit om 'n eenvoudige maar interessante oplossing te implementeer. Om naamlik 'n Telegram-bot te skryf wat, wanneer dit op die bediener self geloods word, die opdragte wat na hom gestuur word, sal uitvoer en die resultaat sal terugstuur. Gestudeer het sommige artikels oor hierdie onderwerp het ek besef dat niemand nog sulke implementerings beskryf het nie.

Ek het hierdie projek op Ubuntu 16.04 geΓ―mplementeer, maar vir 'n probleemvrye loop op ander verspreidings, het ek probeer om alles op 'n algemene manier te maak.

Bot registrasie

Registreer 'n nuwe bot by @BotFather. Ons stuur hom /newbot en verder in die teks. Ons sal 'n nuwe bot-token en jou ID benodig (jy kan dit byvoorbeeld kry van @gebruikersinfobot).

Python voorbereiding

Om die bot te laat loop, sal ons die biblioteek gebruik telebot (pip install pytelegrambotapi). Gebruik die biblioteek subprocess ons sal opdragte op die bediener uitvoer.

Bot bekendstelling

Skep 'n bot.py-lΓͺer op die bediener:
nano bot.py

En plak die kode daarin:

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

Ons vervang die bot-token daarin met die een wat deur @BotFather uitgereik is, en user_id met die id-waarde van jou rekening. Dit is nodig om die gebruiker-ID te kontroleer sodat die bot slegs vir jou toegang tot jou bediener bied. Funksie check_output() voer die gegewe opdrag uit en gee die resultaat terug.

Dit bly net om die bot te begin. Vir die loop van prosesse op die bediener, verkies ek om te gebruik screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(waar "ServerBot" die proses-ID is)

Die proses sal outomaties in die agtergrond loop. Kom ons gaan na die dialoog met die bot en kyk of alles werk soos dit moet:

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

Baie geluk! Die bot voer die opdragte uit wat na hom gestuur word. Nou, om toegang tot die bediener te kry, hoef u net 'n dialoog met die bot te open.

Bevel herhaling

Dikwels, om die toestand van die bediener te monitor, moet jy dieselfde opdragte uitvoer. Daarom sal die implementering van herhalende opdragte sonder om dit weer te stuur baie uit plek wees.

Ons sal dit implementeer met behulp van inlyn-knoppies onder die boodskappe:

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

Herbegin die bot:

killall python3
screen -dmS ServerBot python3 bot.py

Kom ons kyk weer of alles reg werk:

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

Deur die knoppie onder die boodskap te druk, moet die bot die opdrag herhaal waaruit hierdie boodskap gestuur is.

In plaas daarvan om 'n gevolgtrekking

Natuurlik gee hierdie metode nie voor om 'n plaasvervanger vir die klassieke verbindingsmetodes te wees nie, maar dit laat jou toe om vinnig uit te vind oor die toestand van die bediener en opdragte na dit te stuur wat nie komplekse uitvoer vereis nie.

Bron: will.com

Voeg 'n opmerking