Tillgång till linux-server med Telegram-bot i Python

Ganska ofta finns det situationer då åtkomst till servern behövs här och nu. Att ansluta via SSH är dock inte alltid det bekvämaste sättet, eftersom du kanske inte har en SSH-klient, serveradress eller användar/lösenordskombination till hands. Har såklart Webmin, vilket förenklar administrationen, men det ger inte heller omedelbar åtkomst.

Så jag bestämde mig för att implementera en enkel men intressant lösning. Nämligen att skriva en Telegram-bot som, när den startas på själva servern, kommer att utföra de kommandon som skickas till den och returnera resultatet. Efter att ha studerat flera artiklar i detta ämne insåg jag att ingen ännu har beskrivit sådana implementeringar.

Jag implementerade det här projektet på Ubuntu 16.04, men för en problemfri körning på andra distributioner försökte jag göra allt på ett allmänt sätt.

Bot registrering

Registrera en ny bot med @BotFather. Vi skickar honom /newbot och vidare i texten. Vi kommer att behöva en ny bot-token och ditt id (du kan få det till exempel från @användarinfobot).

Python förberedelse

För att köra boten kommer vi att använda biblioteket telebot (pip install pytelegrambotapi). Använda biblioteket subprocess vi kommer att köra kommandon på servern.

Bot lansering

Skapa en bot.py-fil på servern:
nano bot.py

Och klistra in 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 ersätter bot-tokenen i den med den som utfärdats av @BotFather, och user_id med id-värdet för ditt konto. Kontroll av användar-id behövs så att boten endast ger åtkomst till din server till dig. Fungera check_output() kör det givna kommandot och returnerar resultatet.

Det återstår bara att starta boten. För att köra processer på servern föredrar jag att använda screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(där "ServerBot" är process-ID)

Processen körs automatiskt i bakgrunden. Låt oss gå till dialogen med boten och kontrollera att allt fungerar som det ska:

Tillgång till linux-server med Telegram-bot i Python

Grattis! Boten kör kommandona som skickas till den. Nu, för att komma åt servern, behöver du bara öppna en dialog med boten.

Kommandoupprepning

Ofta, för att övervaka serverns tillstånd, måste du utföra samma kommandon. Därför kommer implementeringen av upprepade kommandon utan att skicka om dem vara mycket malplacerad.

Vi kommer att implementera det med hjälp av inline-knappar under meddelandena:

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

Startar om boten:

killall python3
screen -dmS ServerBot python3 bot.py

Låt oss kontrollera igen att allt fungerar korrekt:

Tillgång till linux-server med Telegram-bot i Python

Genom att trycka på knappen under meddelandet måste boten upprepa kommandot från vilket detta meddelande skickades.

I stället för en slutsats

Naturligtvis låtsas den här metoden inte vara en ersättning för de klassiska anslutningsmetoderna, men den låter dig snabbt ta reda på serverns tillstånd och skicka kommandon till den som inte kräver komplex utdata.

Källa: will.com

Lägg en kommentar