Hozzáférés a linux szerverhez a Python Telegram botjával

Gyakran vannak olyan helyzetek, amikor a szerverhez való hozzáférésre itt és most van szükség. Az SSH-n keresztüli csatlakozás azonban nem mindig a legkényelmesebb módja, mert előfordulhat, hogy nincs kéznél SSH-kliens, szervercím vagy felhasználó/jelszó kombináció. Természetesen van Webmint, ami leegyszerűsíti az adminisztrációt, de nem is biztosít azonnali hozzáférést.

Ezért egy egyszerű, de érdekes megoldás mellett döntöttem. Mégpedig olyan Telegram botot írni, amely magán a szerveren elindítva végrehajtja a neki küldött parancsokat, és visszaadja az eredményt. Miután tanult néhány cikkek ebben a témában rájöttem, hogy még senki nem írt le ilyen megvalósításokat.

Ezt a projektet az Ubuntu 16.04-en valósítottam meg, de a problémamentes működés érdekében más disztribúciókon is megpróbáltam mindent általánosan elkészíteni.

Bot regisztráció

Regisztráljon egy új botot a @BotFather szolgáltatással. Küldjük őt /newbot és tovább a szövegben. Szükségünk lesz egy új bot tokenre és az Ön azonosítójára (ezt például innen szerezheti be @userinfobot).

Python előkészítés

A bot futtatásához a könyvtárat fogjuk használni telebot (pip install pytelegrambotapi). A könyvtár használata subprocess parancsokat fogunk végrehajtani a szerveren.

Bot elindítása

Hozzon létre egy bot.py fájlt a szerveren:
nano bot.py

És illessze be a kódot:

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

A benne lévő bot tokent a @BotFather által kibocsátottra cseréljük, a user_id-t pedig a fiókja id értékére. A felhasználói azonosító ellenőrzésére azért van szükség, hogy a bot csak Önnek biztosítson hozzáférést a szerverhez. Funkció check_output() végrehajtja a megadott parancsot, és visszaadja az eredményt.

Már csak a bot elindítása van hátra. A kiszolgálón futó folyamatokhoz én inkább ezt használom screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(ahol a "ServerBot" a folyamatazonosító)

A folyamat automatikusan lefut a háttérben. Lépjünk a párbeszédbe a bottal, és ellenőrizzük, hogy minden megfelelően működik-e:

Hozzáférés a linux szerverhez a Python Telegram botjával

Gratulálunk! A bot végrehajtja a neki küldött parancsokat. Most, hogy hozzáférjen a szerverhez, csak párbeszédet kell nyitnia a bottal.

Parancsismétlés

A szerver állapotának figyeléséhez gyakran ugyanazokat a parancsokat kell végrehajtania. Ezért az ismétlődő parancsok végrehajtása azok újraküldése nélkül nagyon nem lesz helyénvaló.

Az üzenetek alatti soron belüli gombokkal valósítjuk meg:

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

A bot újraindítása:

killall python3
screen -dmS ServerBot python3 bot.py

Ellenőrizzük még egyszer, hogy minden megfelelően működik-e:

Hozzáférés a linux szerverhez a Python Telegram botjával

Az üzenet alatti gomb megnyomásával a botnak meg kell ismételnie azt a parancsot, amelyből az üzenetet küldték.

Ahelyett, hogy egy következtetés

Természetesen ez a módszer nem helyettesíti a klasszikus csatlakozási módokat, azonban lehetővé teszi, hogy gyorsan tájékozódjon a szerver állapotáról, és olyan parancsokat küldjön neki, amelyek nem igényelnek összetett kimenetet.

Forrás: will.com

Hozzászólás