Moitas veces hai situacións nas que se necesita acceso ao servidor aquí e agora. Non obstante, conectarse a través de SSH non sempre é o xeito máis cómodo, porque é posible que non teñas a man un cliente SSH, un enderezo de servidor ou unha combinación de usuario/contrasinal. Por suposto que ten
Entón decidín implementar unha solución sinxela pero interesante. É dicir, escribir un bot de Telegram que, cando se lance no propio servidor, executará os comandos que lle envíen e devolverá o resultado. Ter estudado
Implementei este proxecto en Ubuntu 16.04, pero para unha execución sen problemas noutras distribucións, tentei facer todo dun xeito xeral.
Rexistro de bot
Rexistra un novo bot con @BotFather. Enviámosllelo /newbot
e máis adiante no texto. Necesitaremos un novo token de bot e o teu ID (pode obtelo, por exemplo, de
Preparación de Python
Para executar o bot, utilizaremos a biblioteca telebot
(pip install pytelegrambotapi
). Usando a biblioteca subprocess
executaremos comandos no servidor.
Lanzamento de bot
Crea un ficheiro bot.py no servidor:
nano bot.py
E pega o código nel:
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)#в случае падения
Substituímos o token de bot que hai no mesmo polo emitido por @BotFather e user_id co valor de id da túa conta. É necesario comprobar o identificador de usuario para que o bot ofreza acceso ao teu servidor só a ti. Función check_output()
executa o comando dado e devolve o resultado.
Só queda iniciar o bot. Para executar procesos no servidor, prefiro usar screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(onde "ServerBot" é o ID do proceso)
O proceso executarase automaticamente en segundo plano. Imos ao diálogo co bot e comprobemos que todo funciona como debería:
Parabéns! O bot executa os comandos que lle envían. Agora, para acceder ao servidor, só tes que abrir un diálogo co bot.
Repetición de comandos
Moitas veces, para supervisar o estado do servidor, tes que executar os mesmos comandos. Polo tanto, a implementación de comandos repetidos sen reenvialos estará moi fóra de lugar.
Implementarémolo usando botóns en liña baixo as mensaxes:
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)#в случае падения
Reiniciando o bot:
killall python3
screen -dmS ServerBot python3 bot.py
Comprobamos de novo que todo funciona correctamente:
Ao premer o botón debaixo da mensaxe, o bot debe repetir o comando desde o que se enviou esta mensaxe.
En vez de unha conclusión
Por suposto, este método non pretende ser un substituto dos métodos de conexión clásicos, non obstante, permítelle coñecer rapidamente o estado do servidor e enviarlle comandos que non requiren unha saída complexa.
Fonte: www.habr.com