在 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 服务器

通过按下消息下方的按钮,机器人必须重复发送此消息的命令。

取而代之的是结论

当然,这种方法并不能替代经典的连接方法,但是,它可以让您快速了解服务器的状态并向其发送不需要复杂输出的命令。

来源: habr.com

添加评论