A menudo ocurren situaciones en las que se necesita acceso al servidor aquí y ahora. Sin embargo, no siempre la conexión por SSH es la forma más conveniente, ya que puede que no tengamos un cliente SSH, la dirección del servidor o las credenciales "usuario/contraseña" a mano. Por supuesto, hay , que simplifica la administración, pero tampoco proporciona acceso instantáneo.
Por lo tanto, decidí implementar una solución simple pero interesante. Específicamente, escribir un bot de Telegram que, al ejecutarse en el servidor, ejecute los comandos que se le envían y devuelva el resultado. Tras investigar sobre este tema, me di cuenta de que nadie había descrito implementaciones similares.
Este proyecto lo realicé en Ubuntu 16.04, pero para garantizar un funcionamiento sin problemas en otras distribuciones, traté de hacerlo de manera general.
Registro del bot
Registramos un nuevo bot en @BotFather. Le enviamos /newbot y luego el texto. Necesitaremos el token del nuevo bot y tu id (se puede obtener, por ejemplo, de ).
Preparación de Python
Para ejecutar el bot utilizaremos la biblioteca telebot (pip install pytelegrambotapi). Con la ayuda de la biblioteca subprocess ejecutaremos comandos en el servidor.
Inicio del bot
En el servidor, creamos el archivo bot.py:
nano bot.py
Y pegamos el siguiente código:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token del bot
user_id = 0 #id de tu cuenta
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #verificamos que el propietario sea quien escribe
comand = message.text #texto del mensaje
try: #si el comando no se puede ejecutar, check_output lanzará una excepción
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Entrada inválida") #si el comando es incorrecto
if __name__ == '__main__':
while True:
try:#agregamos try para funcionamiento ininterrumpido
bot.polling(none_stop=True)#iniciamos el bot
except:
time.sleep(10)#en caso de caída
Reemplacemos en él el token del bot con el que proporcionó @BotFather y user_id con el id de tu cuenta. La verificación del id del usuario es necesaria para que el bot proporcione acceso a tu servidor solo a ti. La función check_output() ejecuta el comando recibido y devuelve el resultado.
Solo falta iniciar el bot. Para lanzar procesos en el servidor, prefiero usar screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(donde "ServerBot" es el identificador del proceso)
El proceso se iniciará automáticamente en segundo plano. Vamos a chatear con el bot y comprobar que todo funciona como debería:

¡Felicidades! El bot está ejecutando los comandos que le envías. Ahora, para acceder al servidor, solo necesitas abrir un chat con el bot.
Repetición de comandos
A menudo, para monitorear el estado del servidor, es necesario ejecutar los mismos comandos. Por lo tanto, la implementación de la repetición de comandos sin volver a enviarlos será muy útil.
Vamos a implementarlo usando botones en línea debajo de los mensajes:
from subprocess import check_output
import telebot
from telebot import types #Añadimos la importación de botones
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#Token del bot
user_id = 0 #id de tu cuenta
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #verificamos que lo escriba el propietario
comand = message.text #texto del mensaje
markup = types.InlineKeyboardMarkup() #creamos el teclado
button = types.InlineKeyboardButton(text="Repetir", callback_data=comand) #creamos el botón
markup.add(button) #agregamos el botón al teclado
try: #si el comando no puede ejecutarse - check_output lanzará una excepción
bot.send_message(user_id, check_output(comand, shell = True, reply_markup = markup)) #invocamos el comando y enviamos el mensaje con el resultado
except:
bot.send_message(user_id, "Entrada inválida") #si el comando es incorrecto
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data #leemos el comando del campo de datos del botón
try:#si el comando no puede ejecutarse - check_output lanzará una excepción
markup = types.InlineKeyboardMarkup() #creamos el teclado
button = types.InlineKeyboardButton(text="Repetir", callback_data=comand) #creamos el botón y pasamos el comando en los datos
markup.add(button) #agregamos el botón al teclado
bot.send_message(user_id, check_output(comand, shell = True), reply_markup = markup) #invocamos el comando y enviamos el mensaje con el resultado
except:
bot.send_message(user_id, "Entrada inválida") #si el comando es incorrecto
if __name__ == '__main__':
while True:
try:#añadimos try para un funcionamiento continuo
bot.polling(none_stop=True)#iniciar el bot
except:
time.sleep(10)#en caso de caídas
Reiniciamos el bot:
killall python3
screen -dmS ServerBot python3 bot.py
Verifiquemos nuevamente que todo funcione correctamente:

Al presionar el botón debajo del mensaje, el bot debe repetir el comando del cual se recibió este mensaje.
En conclusión
Sin duda, este método no pretende reemplazar las formas clásicas de conexión, sin embargo, permite obtener información sobre el estado del servidor y enviarle comandos que no requieran una salida compleja de manera relativamente rápida.
Fuente: habr.com
