PythonのTelegramボットを使用したLinuxサーバーへのアクセス

サーバーへのアクセスが今すぐ必要になる状況がよくあります。 ただし、SSH クライアント、サーバー アドレス、またはユーザーとパスワードの組み合わせが手元にない場合があるため、SSH 経由での接続が常に最も便利な方法であるとは限りません。 もちろん持っています Webminこれにより管理が簡素化されますが、即時アクセスは提供されません。

そこで、シンプルだが興味深いソリューションを実装することにしました。 つまり、サーバー自体で起動すると、送信されたコマンドを実行して結果を返す Telegram ボットを作成します。 勉強した上で いくつかの 物品 このトピックに関して、私はまだ誰もそのような実装について説明していないことに気づきました。

このプロジェクトは Ubuntu 16.04 に実装しましたが、他のディストリビューションでも問題なく実行できるように、すべてを一般的な方法で作成するようにしました。

ボットの登録

@BotFather を使用して新しいボットを登録します。 私たちは彼を送ります /newbot さらに本文中。 新しいボット トークンと ID が必要になります (たとえば、次の場所から取得できます)。 @userinfobot).

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

その中のボット トークンを @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

コメントを追加します