Accès au serveur Linux à l'aide du bot Telegram en Python

Très souvent, il existe des situations où l'accès au serveur est nécessaire ici et maintenant. Cependant, la connexion via SSH n'est pas toujours la méthode la plus pratique, car vous ne disposez peut-être pas d'un client SSH, d'une adresse de serveur ou d'une combinaison utilisateur/mot de passe. Bien sûr avoir Webmin, ce qui simplifie l'administration, mais ne fournit pas non plus un accès instantané.

J'ai donc décidé de mettre en place une solution simple mais intéressante. A savoir, écrire un bot Telegram qui, une fois lancé sur le serveur lui-même, exécutera les commandes qui lui seront envoyées et renverra le résultat. Ayant étudié certains articles sur ce sujet, je me suis rendu compte que personne n'a encore décrit de telles implémentations.

J'ai implémenté ce projet sur Ubuntu 16.04, mais pour une exécution sans problème sur d'autres distributions, j'ai essayé de tout faire de manière générale.

Enregistrement de robot

Enregistrez un nouveau bot avec @BotFather. Nous lui envoyons /newbot et plus loin dans le texte. Nous aurons besoin d'un nouveau jeton de bot et de votre identifiant (vous pouvez l'obtenir, par exemple, auprès de @userinfobot).

Préparation Python

Pour exécuter le bot, nous allons utiliser la bibliothèque telebot (pip install pytelegrambotapi). Utilisation de la bibliothèque subprocess nous allons exécuter des commandes sur le serveur.

Lancement du robot

Créez un fichier bot.py sur le serveur :
nano bot.py

Et collez-y le code :

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

Nous remplaçons le jeton de bot qu'il contient par celui émis par @BotFather, et user_id par la valeur d'identifiant de votre compte. La vérification de l'identifiant de l'utilisateur est nécessaire pour que le bot ne donne accès à votre serveur qu'à vous. Fonction check_output() exécute la commande donnée et renvoie le résultat.

Il ne reste plus qu'à démarrer le bot. Pour exécuter des processus sur le serveur, je préfère utiliser screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(où "ServerBot" est l'ID de processus)

Le processus s'exécutera automatiquement en arrière-plan. Passons au dialogue avec le bot et vérifions que tout fonctionne comme il se doit :

Accès au serveur Linux à l'aide du bot Telegram en Python

Toutes nos félicitations! Le bot exécute les commandes qui lui sont envoyées. Maintenant, pour accéder au serveur, il vous suffit d'ouvrir un dialogue avec le bot.

Répétition de la commande

Souvent, pour surveiller l'état du serveur, vous devez exécuter les mêmes commandes. Par conséquent, la mise en œuvre de commandes répétées sans les renvoyer sera très déplacée.

Nous allons l'implémenter en utilisant des boutons en ligne sous les messages :

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

Redémarrage du bot :

killall python3
screen -dmS ServerBot python3 bot.py

Vérifions à nouveau que tout fonctionne correctement :

Accès au serveur Linux à l'aide du bot Telegram en Python

En appuyant sur le bouton sous le message, le bot doit répéter la commande à partir de laquelle ce message a été envoyé.

Au lieu d'une conclusion

Bien sûr, cette méthode ne prétend pas remplacer les méthodes de connexion classiques, cependant, elle permet de connaître rapidement l'état du serveur et de lui envoyer des commandes qui ne nécessitent pas de sortie complexe.

Source: habr.com

Ajouter un commentaire