Molto spesso ci sono situazioni in cui è necessario l'accesso al server qui e ora. Tuttavia, la connessione tramite SSH non è sempre il modo più conveniente, perché potresti non avere a portata di mano un client SSH, un indirizzo del server o una combinazione utente/password. Certo
Così ho deciso di implementare una soluzione semplice ma interessante. Vale a dire, scrivere un bot di Telegram che, una volta avviato sul server stesso, eseguirà i comandi inviatigli e restituirà il risultato. Aver studiato
Ho implementato questo progetto su Ubuntu 16.04, ma per una corsa senza problemi su altre distribuzioni, ho provato a fare tutto in modo generale.
Registrazione bot
Registra un nuovo bot con @BotFather. Lo mandiamo /newbot
e più avanti nel testo. Avremo bisogno di un nuovo token bot e del tuo ID (puoi ottenerlo, ad esempio, da
Preparazione del pitone
Per eseguire il bot, useremo la libreria telebot
(pip install pytelegrambotapi
). Usando la libreria subprocess
eseguiremo i comandi sul server.
Lancio del bot
Crea un file bot.py sul server:
nano bot.py
E incolla il codice al suo interno:
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)#в случае падения
Sostituiamo il token bot in esso contenuto con quello emesso da @BotFather e user_id con il valore id del tuo account. Il controllo dell'ID utente è necessario in modo che il bot fornisca l'accesso al tuo server solo a te. Funzione check_output()
esegue il comando dato e restituisce il risultato.
Resta solo da avviare il bot. Per l'esecuzione di processi sul server, preferisco utilizzare screen
(sudo apt-get install screen
):
screen -dmS ServerBot python3 bot.py
(dove "ServerBot" è l'ID del processo)
Il processo verrà eseguito automaticamente in background. Andiamo al dialogo con il bot e controlliamo che tutto funzioni come dovrebbe:
Congratulazioni! Il bot esegue i comandi che gli vengono inviati. Ora, per accedere al server, devi solo aprire un dialogo con il bot.
Ripetizione del comando
Spesso, per monitorare lo stato del server, è necessario eseguire gli stessi comandi. Pertanto, l'implementazione di comandi ripetuti senza inviarli nuovamente sarà molto fuori luogo.
Lo implementeremo utilizzando i pulsanti in linea sotto i messaggi:
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)#в случае падения
Riavvio del bot:
killall python3
screen -dmS ServerBot python3 bot.py
Verifichiamo nuovamente che tutto funzioni correttamente:
Premendo il pulsante sotto il messaggio, il bot deve ripetere il comando da cui è stato inviato questo messaggio.
Invece di una conclusione
Ovviamente questo metodo non pretende di sostituire i classici metodi di connessione, tuttavia consente di conoscere rapidamente lo stato del server e di inviargli comandi che non richiedono output complessi.
Fonte: habr.com