Com frequência, ocorrem situações em que o acesso ao servidor é necessário aqui e agora. No entanto, nem sempre a conexão via SSH é o método mais conveniente, pois pode não haver um cliente SSH, o endereço do servidor ou a combinação "usuário/senha" à mão. Claro, há , que simplifica a administração, mas também não fornece acesso instantâneo.
Portanto, decidi implementar uma solução simples, mas interessante. Ou seja, escrever um bot do Telegram que, sendo executado no próprio servidor, execute os comandos enviados e retorne o resultado. Após estudar sobre o tema, percebi que ninguém havia descrito implementações semelhantes.
Eu realizei este projeto no Ubuntu 16.04, mas para garantir a execução sem problemas em outras distribuições, fiz o possível para deixá-lo em um formato geral.
Registro do bot
Vamos registrar um novo bot com o @BotFather. Enviamos a ele /newbot e assim por diante. Precisaremos do token do novo bot e do seu id (você pode obtê-lo, por exemplo, com ).
Preparação do Python
Para executar o bot, usaremos a biblioteca telebot (pip install pytelegrambotapi). Com a biblioteca subprocess , vamos executar comandos no servidor.
Iniciando o bot
No servidor, criamos o arquivo bot.py:
nano bot.py
E inserimos o código:
from subprocess import check_output
import telebot
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#token do bot
user_id = 0 #id da sua conta
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): #verificamos se é o dono que está escrevendo
comand = message.text #texto da mensagem
try: #se o comando não puder ser executado - check_output gerará uma exceção
bot.send_message(message.chat.id, check_output(comand, shell = True))
except:
bot.send_message(message.chat.id, "Entrada inválida") #se o comando for incorreto
if __name__ == '__main__':
while True:
try:#adicionamos try para funcionamento ininterrupto
bot.polling(none_stop=True)#inicia o bot
except:
time.sleep(10)#em caso de falha
Substitua o token do bot pelo que foi fornecido pelo @BotFather e o user_id pelo id da sua conta. A verificação do id do usuário é necessária para que o bot forneça acesso ao seu servidor apenas a você. A função check_output() executa o comando recebido e retorna o resultado.
Agora só resta iniciar o bot. Para iniciar processos no servidor, eu prefiro usar screen (sudo apt-get install screen):
screen -dmS ServerBot python3 bot.py(onde "ServerBot" é o identificador do processo)
O processo será iniciado automaticamente em segundo plano. Vamos entrar em diálogo com o bot e verificar se tudo funciona como deveria:

Parabéns! O bot está executando os comandos que lhe são enviados. Agora, para acessar o servidor, basta abrir o diálogo com o bot.
Repetição de comandos
Frequentemente, para monitorar o estado do servidor, é necessário executar os mesmos comandos. Portanto, a implementação da repetição de comandos sem o reenvio dos mesmos será muito útil.
Vamos implementar isso através de botões inline sob as mensagens:
from subprocess import check_output
import telebot
from telebot import types # Adicionando importação de botões
import time
bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") # Token do bot
user_id = 0 # id da sua conta
@bot.message_handler(content_types=["text"])
def main(message):
if (user_id == message.chat.id): # verificamos se a mensagem é do proprietário
comand = message.text # texto da mensagem
markup = types.InlineKeyboardMarkup() # criamos o teclado
button = types.InlineKeyboardButton(text="Repetir", callback_data=comand) # criamos o botão
markup.add(button) # adicionamos o botão ao teclado
try: # se o comando não puder ser executado - check_output gerará uma exceção
bot.send_message(user_id, check_output(comand, shell=True, reply_markup=markup)) # chamamos o comando e enviamos a mensagem com o resultado
except:
bot.send_message(user_id, "Entrada inválida") # se o comando for incorreto
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
comand = call.data # lemos o comando do campo data do botão
try: # se o comando não puder ser executado - check_output gerará uma exceção
markup = types.InlineKeyboardMarkup() # criamos o teclado
button = types.InlineKeyboardButton(text="Repetir", callback_data=comand) # criamos o botão e passamos o comando em data
markup.add(button) # adicionamos o botão ao teclado
bot.send_message(user_id, check_output(comand, shell=True), reply_markup=markup) # chamamos o comando e enviamos a mensagem com o resultado
except:
bot.send_message(user_id, "Entrada inválida") # se o comando for incorreto
if __name__ == '__main__':
while True:
try: # adicionamos try para operação ininterrupta
bot.polling(none_stop=True) # iniciando o bot
except:
time.sleep(10) # no caso de falha
Reiniciando o bot:
killall python3
screen -dmS ServerBot python3 bot.py
Vamos verificar novamente se tudo está funcionando corretamente:

Ao pressionar o botão sob a mensagem, o bot deve repetir o comando do qual esta mensagem foi enviada.
Em conclusão
Certamente, esse método não pretende substituir os modos clássicos de conexão, no entanto, permite saber rapidamente o estado do servidor e enviar comandos, que não exigem uma saída complexa.
Fonte: habr.com
