Piekļuve Linux serverim, izmantojot Telegram robotu Python

Diezgan bieži ir situācijas, kad piekļuve serverim ir nepieciešama šeit un tagad. Tomēr savienojuma izveide, izmantojot SSH, ne vienmēr ir ērtākais veids, jo jums var nebūt pa rokai SSH klienta, servera adreses vai lietotāja/paroles kombinācijas. Protams, ir Webmin, kas vienkāršo administrēšanu, bet arī nenodrošina tūlītēju piekļuvi.

Tāpēc es nolēmu ieviest vienkāršu, bet interesantu risinājumu. Proti, uzrakstīt Telegram botu, kas, palaists pašā serverī, izpildīs tam nosūtītās komandas un atgriezīs rezultātu. Izpētījis daži raksti par šo tēmu es sapratu, ka neviens vēl nav aprakstījis šādas realizācijas.

Es ieviesu šo projektu Ubuntu 16.04 versijā, taču, lai bez problēmām darbotos citos izplatījumos, mēģināju visu izveidot vispārīgi.

Botu reģistrācija

Reģistrējiet jaunu robotu ar @BotFather. Mēs viņu nosūtām /newbot un tālāk tekstā. Mums būs nepieciešams jauns robota marķieris un jūsu ID (to var iegūt, piemēram, no @userinfobot).

Python sagatavošana

Lai palaistu robotprogrammatūru, mēs izmantosim bibliotēku telebot (pip install pytelegrambotapi). Izmantojot bibliotēku subprocess mēs izpildīsim komandas serverī.

Bota palaišana

Izveidojiet bot.py failu serverī:
nano bot.py

Un ielīmējiet tajā kodu:

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

Mēs aizstājam tajā esošo robota marķieri ar to, ko izdevis @BotFather, un user_id ar jūsu konta id vērtību. Lietotāja ID pārbaude ir nepieciešama, lai robots nodrošinātu piekļuvi jūsu serverim tikai jums. Funkcija check_output() izpilda doto komandu un atgriež rezultātu.

Atliek tikai palaist botu. Procesu palaišanai serverī es gribētu izmantot screen (sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(kur "ServerBot" ir procesa ID)

Process automātiski darbosies fonā. Dosimies uz dialogu ar robotprogrammatūru un pārbaudīsim, vai viss darbojas tā, kā vajadzētu:

Piekļuve Linux serverim, izmantojot Telegram robotu Python

Apsveicam! Bots izpilda tam nosūtītās komandas. Tagad, lai piekļūtu serverim, jums vienkārši jāatver dialogs ar robotu.

Komandu atkārtošana

Bieži vien, lai uzraudzītu servera stāvokli, jums ir jāizpilda tās pašas komandas. Tāpēc atkārtotu komandu ieviešana bez atkārtotas nosūtīšanas būs ļoti nevietā.

Mēs to ieviesīsim, izmantojot iekļautās pogas zem ziņojumiem:

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

Bota restartēšana:

killall python3
screen -dmS ServerBot python3 bot.py

Vēlreiz pārbaudīsim, vai viss darbojas pareizi:

Piekļuve Linux serverim, izmantojot Telegram robotu Python

Nospiežot pogu zem ziņojuma, robotam ir jāatkārto komanda, no kuras šis ziņojums tika nosūtīts.

Tā vietā, lai noslēgtu

Protams, šī metode nepretendē uz klasisko savienojuma metožu aizstājēju, tomēr ļauj ātri uzzināt par servera stāvokli un nosūtīt uz to komandas, kurām nav nepieciešama sarežģīta izvade.

Avots: www.habr.com

Pievieno komentāru