Tilgang til linux-server ved hjelp av Telegram-bot i Python

Ganske ofte er det situasjoner hvor tilgang til serveren er nødvendig her og nå. Men å koble til via SSH er ikke alltid den mest praktiske måten, fordi du kanskje ikke har en SSH-klient, serveradresse eller bruker/passord-kombinasjon for hånden. Selvfølgelig har webmin, som forenkler administrasjonen, men det gir heller ikke umiddelbar tilgang.

Så jeg bestemte meg for å implementere en enkel, men interessant løsning. Nemlig å skrive en Telegram-bot som, når den startes på selve serveren, vil utføre kommandoene som sendes til den og returnere resultatet. Etter å ha studert noen Artikkel om dette emnet innså jeg at ingen ennå har beskrevet slike implementeringer.

Jeg implementerte dette prosjektet på Ubuntu 16.04, men for en problemfri kjøring på andre distribusjoner, prøvde jeg å lage alt på en generell måte.

Bot registrering

Registrer en ny bot med @BotFather. Vi sender ham /newbot og videre i teksten. Vi trenger et nytt bot-token og ID-en din (du kan få den for eksempel fra @brukerinfobot).

Python forberedelse

For å kjøre boten bruker vi biblioteket telebot (pip install pytelegrambotapi). Bruke biblioteket subprocess vi vil utføre kommandoer på serveren.

Bot lansering

På serveren oppretter du en bot.py-fil:
nano bot.py

Og lim inn koden i den:

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

Vi erstatter bot-tokenet i det med det utstedt av @BotFather, og user_id med id-verdien til kontoen din. Det er nødvendig å sjekke bruker-IDen slik at boten bare gir deg tilgang til serveren din. Funksjon check_output() utfører den gitte kommandoen og returnerer resultatet.

Det gjenstår bare å starte boten. For å kjøre prosesser på serveren foretrekker jeg å bruke screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(der "ServerBot" er prosess-IDen)

Prosessen kjøres automatisk i bakgrunnen. La oss gå til dialogen med boten og sjekke at alt fungerer som det skal:

Tilgang til linux-server ved hjelp av Telegram-bot i Python

Gratulerer! Boten utfører kommandoene som sendes til den. Nå, for å få tilgang til serveren, trenger du bare å åpne en dialog med boten.

Kommando repetisjon

Ofte, for å overvåke tilstanden til serveren, må du utføre de samme kommandoene. Derfor vil implementering av repeterende kommandoer uten å sende dem på nytt være veldig malplassert.

Vi vil implementere det ved å bruke innebygde knapper under meldingene:

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

Starter boten på nytt:

killall python3
screen -dmS ServerBot python3 bot.py

La oss sjekke igjen at alt fungerer som det skal:

Tilgang til linux-server ved hjelp av Telegram-bot i Python

Ved å trykke på knappen under meldingen, må boten gjenta kommandoen som denne meldingen ble sendt fra.

I stedet for en konklusjon

Selvfølgelig later ikke denne metoden til å være en erstatning for de klassiske tilkoblingsmetodene, men den lar deg raskt finne ut om tilstanden til serveren og sende kommandoer til den som ikke krever kompleks utgang.

Kilde: www.habr.com

Legg til en kommentar