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

Très souvent, il y a des situations où l'accès au serveur est nécessaire ici et maintenant. Cependant, la connexion SSH n'est pas toujours le moyen le plus pratique, car le client SSH, l'adresse du serveur ou le lien utilisateur / mot de passe peuvent ne pas être à portée de main. Bien sûr, il y a Webmin , qui simplifie l'administration, mais il ne donne pas non plus d'accès instantané.

J'ai donc décidé de mettre en œuvre une solution simple mais intéressante. À savoir, pour écrire un bot Telegram, qui, à partir du serveur lui-même, exécutera les commandes qui lui seront envoyées et retournera le résultat. Après avoir étudié plusieurs articles sur ce sujet, j'ai réalisé que personne n'avait encore décrit de telles implémentations.

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

Enregistrement du bot


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

Préparation Python


Pour démarrer le bot, nous utiliserons la bibliothèque telebot ( pip install pytelegrambotapi ). En utilisant la bibliothèque de subprocess - subprocess , nous exécuterons des commandes sur le serveur.

Lancement du bot


Sur le serveur, créez le fichier bot.py:
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'ID de votre compte. La vérification de l'ID utilisateur est nécessaire pour que le bot ne vous donne accès à votre serveur. La fonction check_output() exécute la commande passée et renvoie le résultat.

Il ne reste plus qu'à lancer le bot. Pour démarrer les 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'identifiant du processus)

Le processus démarre automatiquement en arrière-plan. Entrons dans le dialogue avec le bot et vérifions que tout fonctionne comme il se doit:



Félicitations! Le bot exécute les commandes qui lui sont envoyées. Maintenant, pour accéder au serveur, il vous suffit d'ouvrir une boîte de dialogue avec le bot.

Répétition des commandes


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

Nous allons implémenter en utilisant les 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émarrez le bot:

 killall python3 screen -dmS ServerBot python3 bot.py 

Vérifiez à nouveau que tout fonctionne correctement:



En appuyant sur le bouton sous le message, le bot doit répéter la commande à partir de laquelle le 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, mais elle vous permet de connaître rapidement l'état du serveur et de lui envoyer des commandes qui ne nécessitent pas de sortie complexe.

Source: https://habr.com/ru/post/fr443846/


All Articles