Il arrive fréquemment que l'accès au serveur soit nécessaire ici et maintenant. Cependant, la connexion via SSH n'est pas toujours la méthode la plus pratique, car il se peut qu'un client SSH, l'adresse du serveur ou le couple « utilisateur/mot de passe » ne soient pas à portée de main. Bien sûr, il y a , qui simplifie l'administration, mais il ne permet pas non plus un accès immédiat.
C'est pourquoi j'ai décidé de mettre en œuvre une solution simple mais intéressante. En effet, j'ai écrit un bot Telegram qui, en se lançant directement sur le serveur, exécutera les commandes qui lui seront envoyées et renverra les résultats. Après avoir étudié à ce sujet, j'ai compris qu'aucune des mises en œuvre similaires n'avait été décrite auparavant.
Ce projet a été réalisé sur Ubuntu 16.04, mais j'ai essayé de le rendre compatible pour un fonctionnement sans problème sur d'autres distributions.
Enregistrement du bot
Nous enregistrons un nouveau bot via @BotFather. Nous lui envoyons /newbot et ainsi de suite. Nous aurons besoin du token du nouveau bot et de votre id (celui-ci peut être obtenu, par exemple, auprès de ).
Préparation de Python
Pour lancer le bot, nous allons utiliser la bibliothèque telebot (pip install pytelegrambotapi). Avec cette bibliothèque, nous allons exécuter des commandes sur le serveur. subprocess permettra d'exécuter des commandes sur le serveur.
Lancement du bot
Sur le serveur, nous créons le fichier bot.py :
nano bot.py
Et nous y insérons le code :
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token du bot
user_id = 0 #id de votre compte
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #vérifions que c'est bien le propriétaire qui écrit
comand = message.text #texte du message
try: #si la commande n'est pas exécutable - check_output lèvera une exception
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Entrée invalide") #si la commande est incorrecte
if __name__ == '__main__':
while True:
try:#ajoutons un try pour un fonctionnement ininterrompu
bot.polling(none_stop=True)#lancement du bot
except:
time.sleep(10)#en cas de crash
Remplacez dans ce fichier le token du bot par celui fourni par @BotFather, et user_id par la valeur id de votre compte. La vérification de l'id de l'utilisateur est nécessaire pour que le bot accorde l'accès à votre serveur uniquement à vous. La fonction check_output() exécute la commande passée et retourne le résultat.
Il ne reste plus qu'à lancer le bot. Pour lancer 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'identifiant du processus)
Le processus démarrera automatiquement en arrière-plan. Passons au dialogue avec le bot et vérifions que tout fonctionne comme prévu :

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 des commandes
Souvent, pour surveiller l'état du serveur, il est nécessaire d'exécuter les mêmes commandes plusieurs fois. Par conséquent, la mise en œuvre de la répétition des commandes sans les renvoyer sera très utile.
Nous allons le réaliser à l'aide de boutons inline sous les messages :
from subprocess import check_output
import telebot
from telebot import types #Ajoutons l'importation des boutons
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token du bot
user_id = 0 #id de votre compte
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #vérifions que c'est bien le propriétaire qui écrit
comand = message.text #texte du message
markup = types.InlineKeyboardMarkup() #créons le clavier
button = types.InlineKeyboardButton(text="Répéter", callback_data=comand) #créons le bouton
markup.add(button) #ajoutons le bouton au clavier
try: #si la commande n'est pas exécutable - check_output renverra une exception
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) #appelons la commande et envoyons le message avec le résultat
except:
bot.send_message(user_id, "Entrée invalide") #si la commande est incorrecte
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data #lisons la commande depuis le champ de données du bouton
try:#si la commande n'est pas exécutable - check_output renverra une exception
markup = types.InlineKeyboardMarkup() #créons le clavier
button = types.InlineKeyboardButton(text="Répéter", callback_data=comand) #créons le bouton et envoyons la commande dans les données
markup.add(button) #ajoutons le bouton au clavier
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #appelons la commande et envoyons le message avec le résultat
except:
bot.send_message(user_id, "Entrée invalide") #si la commande est incorrecte
if __name__ == '__main__':
while True:
try:#ajoutons un essai pour un fonctionnement ininterrompu
bot.polling(none_stop=True)#lancement du bot
except:
time.sleep(10)#en cas de plantage
Redémarrons le bot :
killall python3
screen -dmS ServerBot python3 bot.py
Vérifions à nouveau que tout fonctionne correctement :

En appuyant sur le bouton sous le message, le bot doit répéter la commande depuis laquelle ce message a été envoyé.
En conclusion
Bien sûr, cette méthode ne prétend pas remplacer les méthodes classiques de connexion, mais elle permet d'obtenir rapidement des informations sur l'état du serveur et d'envoyer des commandes sans nécessiter de sortie complexe.
Source : habr.com
