在 Python 中使用 Telegram bot 訪問 linux 服務器

經常會出現此時需要訪問服務器的情況。 但是,通過 SSH 連接並不總是最方便的方式,因為您手邊可能沒有 SSH 客戶端、服務器地址或用戶/密碼組合。 當然有 Webmin的,這簡化了管理,但也不提供即時訪問。

所以我決定實施一個簡單但有趣的解決方案。 也就是說,編寫一個 Telegram 機器人,當它在服務器本身上啟動時,將執行發送給它的命令並返回結果。 經過學習 幾個 用品 關於這個話題,我意識到還沒有人描述過這樣的實現。

我在 Ubuntu 16.04 上實現了這個項目,但為了在其他發行版上無故障運行,我嘗試以通用方式製作所有內容。

機器人註冊

使用@BotFather 註冊一個新的機器人。 我們送他 /newbot 並在文中進一步說明。 我們將需要一個新的機器人令牌和您的 ID(例如,您可以從 @用戶資訊機器人).

Python準備

要運行機器人,我們將使用庫 telebot (pip install pytelegrambotapi). 使用圖書館 subprocess 我們將在服務器上執行命令。

機器人啟動

在服務器上創建一個 bot.py 文件:
nano bot.py

並將代碼粘貼到其中:

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)#в случае падения

我們將其中的 bot token 替換為@BotFather 頒發的,將 user_id 替換為您帳戶的 id 值。 需要檢查用戶 ID,以便機器人只向您提供對您服務器的訪問權限。 功能 check_output() 執行給定的命令並返回結果。

它仍然只是啟動機器人。 對於在服務器上運行的進程,我更喜歡使用 screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(其中“ServerBot”是進程 ID)

該進程將自動在後台運行。 讓我們進入與機器人的對話並檢查是否一切正常:

在 Python 中使用 Telegram bot 訪問 linux 服務器

恭喜! 機器人執行發送給它的命令。 現在,為了訪問服務器,您只需要打開與機器人的對話。

命令重複

通常,要監視服務器的狀態,您必須執行相同的命令。 因此,重複命令而不重新發送命令的實現會很不合適。

我們將使用消息下方的內聯按鈕來實現它:

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)#в случае падения

重啟機器人:

killall python3
screen -dmS ServerBot python3 bot.py

讓我們再次檢查一切是否正常:

在 Python 中使用 Telegram bot 訪問 linux 服務器

通過按下消息下方的按鈕,機器人必須重複發送此消息的命令。

取而代之的是結論

當然,這種方法並不能替代經典的連接方法,但是,它可以讓您快速了解服務器的狀態並向其發送不需要復雜輸出的命令。

來源: www.habr.com

添加評論