Adgang til linux-server ved hjælp af Telegram-bot i Python

Ganske ofte er der situationer, hvor der er behov for adgang til serveren her og nu. Men at oprette forbindelse via SSH er ikke altid den mest bekvemme måde, fordi du måske ikke har en SSH-klient, serveradresse eller bruger/adgangskode-kombination ved hånden. Selvfølgelig har Webmin, hvilket forenkler administrationen, men det giver heller ikke øjeblikkelig adgang.

Så jeg besluttede at implementere en enkel, men interessant løsning. Nemlig at skrive en Telegram-bot, der, når den startes på selve serveren, vil udføre de kommandoer, der sendes til den, og returnere resultatet. Efter at have studeret flere artikler om dette emne indså jeg, at ingen endnu har beskrevet sådanne implementeringer.

Jeg implementerede dette projekt på Ubuntu 16.04, men for en problemfri kørsel på andre distributioner forsøgte jeg at lave alt på en generel måde.

Bot registrering

Registrer en ny bot med @BotFather. Vi sender ham /newbot og videre i teksten. Vi skal bruge et nyt bot-token og dit id (du kan f.eks. få det fra @brugerinfobot).

Python forberedelse

For at køre botten bruger vi biblioteket telebot (pip install pytelegrambotapi). Brug af biblioteket subprocess vi udfører kommandoer på serveren.

Bot-lancering

Opret en bot.py-fil på serveren:
nano bot.py

Og indsæt 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, der er udstedt af @BotFather, og user_id med id-værdien for din konto. Det er nødvendigt at tjekke bruger-id'et, så botten kun giver dig adgang til din server. Fungere check_output() udfører den givne kommando og returnerer resultatet.

Det er kun tilbage at starte botten. Til at køre processer på serveren foretrækker jeg at bruge screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(hvor "ServerBot" er proces-id'et)

Processen kører automatisk i baggrunden. Lad os gå til dialogen med botten og kontrollere, at alt fungerer, som det skal:

Adgang til linux-server ved hjælp af Telegram-bot i Python

Tillykke! Botten udfører de kommandoer, der sendes til den. Nu, for at få adgang til serveren, skal du blot åbne en dialog med botten.

Kommando gentagelse

For at overvåge serverens tilstand skal du ofte udføre de samme kommandoer. Derfor vil implementeringen af ​​gentagne kommandoer uden at sende dem igen være meget malplaceret.

Vi implementerer det ved hjælp af inline-knapper under meddelelserne:

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

Genstart af bot:

killall python3
screen -dmS ServerBot python3 bot.py

Lad os kontrollere igen, at alt fungerer korrekt:

Adgang til linux-server ved hjælp af Telegram-bot i Python

Ved at trykke på knappen under beskeden skal botten gentage kommandoen, hvorfra denne besked blev sendt.

I stedet for en konklusion

Selvfølgelig foregiver denne metode ikke at være en erstatning for de klassiske forbindelsesmetoder, men den giver dig mulighed for hurtigt at finde ud af serverens tilstand og sende kommandoer til den, der ikke kræver kompleks output.

Kilde: www.habr.com

Tilføj en kommentar