Python에서 Telegram 봇을 사용하여 Linux 서버에 액세스

지금 여기에서 서버에 대한 액세스가 필요한 상황이 종종 있습니다. 그러나 SSH를 통한 연결이 항상 가장 편리한 방법은 아닙니다. SSH 클라이언트, 서버 주소 또는 사용자/비밀번호 조합이 없을 수 있기 때문입니다. 물론 가지고 Webmin, 이는 관리를 단순화하지만 즉각적인 액세스를 제공하지도 않습니다.

그래서 간단하지만 흥미로운 솔루션을 구현하기로 결정했습니다. 즉, 서버 자체에서 실행될 때 전송된 명령을 실행하고 결과를 반환하는 Telegram 봇을 작성합니다. 공부한 여러 조항 이 주제에 대해 아직 아무도 그러한 구현을 설명하지 않았다는 것을 깨달았습니다.

이 프로젝트는 우분투 16.04에서 구현했지만, 다른 배포판에서도 문제 없이 실행하기 위해 모든 것을 일반적인 방법으로 만들려고 노력했습니다.

봇 등록

@BotFather에 새 봇을 등록합니다. 우리는 그를 보낸다 /newbot 그리고 텍스트에서 더. 새 봇 토큰과 ID가 필요합니다(예를 들어 다음에서 얻을 수 있음). @userinfobot).

파이썬 준비

봇을 실행하려면 라이브러리를 사용합니다. 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)#в случае падения

그 안의 봇 토큰을 @BotFather에서 발행한 것으로, user_id를 계정의 id 값으로 바꿉니다. 봇이 귀하에게만 귀하의 서버에 대한 액세스를 제공하도록 사용자 ID를 확인하는 것이 필요합니다. 기능 check_output() 주어진 명령을 실행하고 결과를 반환합니다.

봇을 시작하는 것만 남아 있습니다. 서버에서 프로세스를 실행하려면 다음을 사용하는 것을 선호합니다. screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(여기서 "ServerBot"은 프로세스 ID임)

프로세스는 백그라운드에서 자동으로 실행됩니다. 봇과의 대화로 이동하여 모든 것이 정상적으로 작동하는지 확인합니다.

Python에서 Telegram 봇을 사용하여 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 봇을 사용하여 Linux 서버에 액세스

메시지 아래에 있는 버튼을 누르면 봇은 이 메시지가 전송된 명령을 반복해야 합니다.

대신 결론

물론 이 방법은 기존 연결 방법을 대체하는 척하지는 않지만 서버 상태를 빠르게 파악하고 복잡한 출력이 필요하지 않은 명령을 서버에 보낼 수 있습니다.

출처 : habr.com

코멘트를 추가