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
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é
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
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 :
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 :
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