Accesso al server Linux utilizzando il bot di Telegram in Python

Molto spesso ci sono situazioni in cui è necessario l'accesso al server qui e ora. Tuttavia, la connessione tramite SSH non è sempre il modo più conveniente, perché potresti non avere a portata di mano un client SSH, un indirizzo del server o una combinazione utente/password. Certo Webmin, che semplifica l'amministrazione, ma non fornisce nemmeno l'accesso istantaneo.

Così ho deciso di implementare una soluzione semplice ma interessante. Vale a dire, scrivere un bot di Telegram che, una volta avviato sul server stesso, eseguirà i comandi inviatigli e restituirà il risultato. Aver studiato un po 'di articoli su questo argomento, mi sono reso conto che nessuno ha ancora descritto tali implementazioni.

Ho implementato questo progetto su Ubuntu 16.04, ma per una corsa senza problemi su altre distribuzioni, ho provato a fare tutto in modo generale.

Registrazione bot

Registra un nuovo bot con @BotFather. Lo mandiamo /newbot e più avanti nel testo. Avremo bisogno di un nuovo token bot e del tuo ID (puoi ottenerlo, ad esempio, da @userinfobot).

Preparazione del pitone

Per eseguire il bot, useremo la libreria telebot (pip install pytelegrambotapi). Usando la libreria subprocess eseguiremo i comandi sul server.

Lancio del bot

Crea un file bot.py sul server:
nano bot.py

E incolla il codice al suo interno:

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

Sostituiamo il token bot in esso contenuto con quello emesso da @BotFather e user_id con il valore id del tuo account. Il controllo dell'ID utente è necessario in modo che il bot fornisca l'accesso al tuo server solo a te. Funzione check_output() esegue il comando dato e restituisce il risultato.

Resta solo da avviare il bot. Per l'esecuzione di processi sul server, preferisco utilizzare screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(dove "ServerBot" è l'ID del processo)

Il processo verrà eseguito automaticamente in background. Andiamo al dialogo con il bot e controlliamo che tutto funzioni come dovrebbe:

Accesso al server Linux utilizzando il bot di Telegram in Python

Congratulazioni! Il bot esegue i comandi che gli vengono inviati. Ora, per accedere al server, devi solo aprire un dialogo con il bot.

Ripetizione del comando

Spesso, per monitorare lo stato del server, è necessario eseguire gli stessi comandi. Pertanto, l'implementazione di comandi ripetuti senza inviarli nuovamente sarà molto fuori luogo.

Lo implementeremo utilizzando i pulsanti in linea sotto i messaggi:

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

Riavvio del bot:

killall python3
screen -dmS ServerBot python3 bot.py

Verifichiamo nuovamente che tutto funzioni correttamente:

Accesso al server Linux utilizzando il bot di Telegram in Python

Premendo il pulsante sotto il messaggio, il bot deve ripetere il comando da cui è stato inviato questo messaggio.

Invece di una conclusione

Ovviamente questo metodo non pretende di sostituire i classici metodi di connessione, tuttavia consente di conoscere rapidamente lo stato del server e di inviargli comandi che non richiedono output complessi.

Fonte: habr.com

Aggiungi un commento